Содержание


Интеграция Hadoop с существующей реляционной СУБД

Подход к разработке

Comments

Среда Apache™ Hadoop® включает множество компонентов, среди которых MapReduce, HDFS, Pig, Hive, Oozie, Sqoop и Flume. Эти инструменты и технологии Hadoop предназначены для обработки больших данных. Импортировав данные в Hadoop, можно анализировать и использовать эти данные с помощью таких инструментов, как Jaql и R.

Для описания общих принципов интеграции Hadoop, в частности, файловой системы Hadoop Distributed File System (HDFS), с существующей реляционной системой управления базами данных (РСУБД) в этой статье в качестве примера используется система обработки заявок на кредитование. Для подачи заявки на кредитование клиент обращается в банк и встречается со специалистом отдела кредитования. Клиент предоставляет свои банковские реквизиты, по которым специалист отдела кредитования проверяет операции в банковской системе. По результатам такой оценки, выполняемой вручную, специалист отдела кредитования принимает решение об одобрении запроса или отказе в кредитовании. В случае положительного решения клиент передает в банк заявку на кредитование, которая проходит через серию утверждений для окончательного одобрения кредита.

Операции предиктивного и прескриптивного анализа больших данных обычно требуют значительной обработки. Такие операции следует выполнять, используя данные в файловой системе HDFS кластера Hadoop (а не данные в реляционной СУБД). Благодаря средствам хранения и параллельной обработки HDFS, а также способности кластера Hadoop оптимальным образом функционировать на множестве доступных аппаратных систем, такое интегрированное решение:

  • хорошо масштабируется;
  • позволяет сократить затраты на хранение данных;
  • повышает эффективность всей среды больших данных.

Поскольку Hadoop может хранить больше данных и больше типов данных (структурированных и неструктурированных), процессы анализа данных становятся более интеллектуальными и в конечном итоге помогают принимать более эффективные решения.

Настройка кластера Hadoop

При настройке кластера Hadoop используйте доступную информацию для конкретного решения Hadoop. Среди известных стандартных решений можно упомянуть IBM Open Platform с IBM BigInsights для Apache Hadoop от IBM, CDH от Cloudera и Hortonworks Data Platform (HDP) от Hortonworks. Кроме того, ознакомьтесь с книгами, перечисленными в разделе «Ресурсы».

Прочтите серию статей IBM developerWorks Архитектура и шаблоны больших данных, в которой изложен структурированный, основанный на шаблонах подход, упрощающий определение общей архитектуры больших данных. Если вам нужные новые идеи и поддержка, обратитесь к блогам и сообществам, посвященным большим данным.

Исходя из моего опыта и исследований, при настройке защищенного масштабируемого кластера Hadoop стоит обратить внимание на следующие советы и рекомендации:

  • Перед настройкой архитектуры Hadoop обязательно создайте новую учетную запись пользователя Hadoop. Эта позволит отделить установку Hadoop от других служб, выполняемых на той же системе.
  • Избегайте использования в своей конфигурации массивов RAID (Redundant Array of Independent Disks) по следующим причинам:
    • В избыточности, обеспечиваемой массивами RAID, нет необходимости, поскольку HDFS по умолчанию обеспечивает избыточность с использованием репликации между узлами.
    • Отказ диска в конфигурации RAID оказывает влияние на весь дисковый массив, и в результате узел становится недоступен. А в HDFS такой узел будет продолжать функционировать без отказавшего диска.
    • В системах RAID скорость операций чтения и записи ограничивается производительностью самого медленного диска в массиве. В противоположность этому, HDFS использует конфигурацию JBOD (набор независимых дисков), в которой дисковые операции являются независимыми, и в результате скорость превышает производительность самого медленного диска.
  • Рассчитайте потребности в хранении данных, умножив количество имеющихся узлов на ожидаемый объем данных, которые вы будете собирать в течение конкретного времени.
  • Для поддержки максимальной производительности в многостоечном кластере Hadoop задайте соответствия между узлами и стойками с использованием свойства конфигурации topology.node.switch.mapping.impl.
  • Позаботьтесь о наличии достаточного объема оперативной памяти на узле NameNode. Обычно узел NameNode имеет высокие требования к памяти, поскольку хранит в памяти метаданные файлов и блоков для всего пространства имен. Резервный узел NameNode просто хранит копию или зеркало узла NameNode.
  • Основной и резервный экземпляры NameNode можно разместить на одном и том же узле, однако в некоторых сценариях требуется их размещение на отдельных узлах. Например, их следует разместить на разных узлах для поддержки восстановления узла NameNode в случае потери (или повреждения) всех файлов метаданных.
  • Разместите JobTracker на выделенном узле, поскольку количество выполняемых им заданий MapReduce может расти.
  • Если NameNode и JobTracker размещены на отдельных узлах, синхронизируйте их подчиненные файлы, поскольку экземпляры DataNode и TaskTracker должны выполняться на каждом узле в кластере.
  • Изучайте журналы аудита для процессов NameNode и JobTracker и менеджеров ресурсов. В HDFS есть собственный журнал аудита.
  • Чтобы контролировать использование памяти и процессоров при выполнении операций HDFS, задайте следующие свойства:
    • mapred.tasktracker.map.tasks.maximum — определяет максимальное количество заданий Map, которые TaskTracker может выполнять одновременно.
    • mapred.tasktracker.reducer.tasks.maximum — определяет максимальное количество заданий Reduce, которые TaskTracker может выполнять одновременно.
    • mapred.child.java.opts — определяет объем оперативной памяти, выделяемой каждой дочерней JVM, генерируемой такими заданиями Map или Reduce.
  • Для файлов, которые не будут часто обновляться, используйте DistributedCache с целью их кэширования в программах MapReduce.
  • Можно также настроить требования к оперативной памяти для основного и резервного экземпляров NameNode, используя параметры HADOOP_NAMENODE_OPTS и HADOOP_SECONDARYNAMENODE_OPTS в сценарии hadoop-env.sh.
  • Сконфигурируйте архитектуру обеспечения безопасности в своем кластере Hadoop с применением следующих инструментов и технологий:
    • По умолчанию для авторизации и аутентификации в Hadoop используется инструмент whoami (доступный в большинстве операционных систем UNIX). К сожалению, этот инструмент может легко использовать каждый, кто знает регистрационные данные для операционной системы. Чтобы повысить уровень безопасности кластера Hadoop, сконфигурируйте его на использование механизма аутентификации Kerberos. Кроме того, необходимо дополнить базовый механизм аутентификации Kerberos маркерами безопасности.
    • Убедитесь в том, что в кластере Hadoop реализован механизм Kerberos. Kerberos инициирует и устанавливает соединение между клиентом (J2EE-приложением) и кластером Hadoop. Последующие вызовы служб, обращения к файлам и задания будут обрабатываться защищенным образом с использованием маркеров безопасности (маркеров делегирования, маркеров доступа к блокам и маркеров заданий). Такой поход также сводит к минимуму нагрузку, которую оказывали бы создаваемые задачи на Kerberos Key Distribution Center, если бы он должен был генерировать маркер для каждой задачи.
    • Настройте механизм управления потоком работ Oozie. Задания Oozie Workflow требуют настройки доверенных маркеров, чтобы задания могли выполняться от имени пользователя, инициирующего поток работ.
    • Сконфигурируйте механизм Spengo, входящий в состав Hadoop, чтобы обеспечить аутентификацию для web-интерфейсов, таких как Hue. Для обеспечения конфиденциальности данных в Hadoop выполняется их псевдошифрование данных с использованием встроенных форматов сжатия.

    Дополнительную информацию об обеспечении безопасности в кластере Hadoop можно найти в техническом отчете Adding Security to Apache Hadoop.

  • Настроив кластер Hadoop, протестируйте его производительность.

Перемещение данных в файловую систему Hadoop Distributed File System (HDFS)

Настроив кластер Hadoop, можно приступать к импорту данных. Для примера обработки заявок на кредитование необходимо интегрировать кластер Hadoop с существующим банковским приложением, использующим реляционную СУБД как хранилище данных. Затем нужно организовать перемещение данных между новой файловой системой HDFS и существующей реляционной СУБД. Файловая система HDFS может либо заменить хранилища данных, либо связать структурированные и неструктурированные данные с существующими хранилищами данных.

Исходя из моего опыта и исследований, при настройке HDFS могут быть полезны следующие советы и рекомендации:

  • Операция в HDFS должна приводить к одному и тому же результату вне зависимости от того, сколько раз она выполняется.
  • Перед перемещением данных в HDFS агрегируйте их, чтобы программы MapReduce использовали минимальные объемы памяти для преобразования, в особенности на узле NameNode.
  • Перед перемещением данных в HDFS преобразуйте их из исходного формата в формат, подходящий для целевой системы.
  • Реализуйте механизм восстановления после отказа, чтобы в случае неудачного выполнения операции, например по причине недоступности узла, она выполнялась повторно.
  • Проверяйте отсутствие повреждений в данных при их передаче по сети.
  • Контролируйте степень параллелизма и количество выполняемых программ MapReduce, которые оказывают влияние на потребление ресурсов и производительность.
  • Отслеживайте операции, чтобы быть уверенным, что они выполняются успешно и приводят к ожидаемым результатам.

Для импорта данных в HDFS можно использовать программы MapReduce и применять такие шаблоны разработки, как фильтрация, разделение или создание цепочек заданий, однако я рекомендую для передачи данных использовать Sqoop. В Sqoop применяются файлы конфигурации, которые можно быстрее развертывать и обновлять в рабочей среде.

Первым шагом является установка Sqoop. Изучите документацию к Apache Sqoop для получения информации о том, как установить Sqoop в кластер Hadoop.

После установки Sqoop используйте следующий простой код для импорта данных в HDFS, указав информацию о JDBC-соединении с реляционной СУБД:

sqoop import --username appuser --password apppassword 
--connect jdbc:mysql://server/banking_app 
--table transactions

Безусловно, такие регистрационные данные можно сохранить в файл и ссылаться на него в параметре –options-file. Элемент jdbc:mysql://server/banking_app — это URL-адрес базы данных для JDBC-соединения, который используется в примере обработки запросов на кредитование для демонстрации этой среды Hadoop.

При использовании Sqoop данные импортируются из реляционной СУБД в HDFS с некоторыми интервалами, в связи с их значительными объемами. Если эта часть системы предназначена для поддержки операций в реальном времени, пользователям придется слишком долго ждать выполнения операции или запроса. Кроме того, поскольку нет необходимости импортировать повторяющиеся данные или устаревшие данные, можно разработать задания для получения данных с использованием критериев, основанных времени. Таким образом, задание будет выбирать из данных реляционной СУБД в банковском приложении только самые свежие данные.

Механизм Oozie Workflow позволяет выполнять программы MapReduce как запланированные задания через указанные интервалы времени. В листинге 1 показан файл конфигурации Oozie Workflow.

Листинг 1. Файл конфигурации Oozie Workflow
<workflow-app xmlns='uri:oozie:workflow:0.1' name='processData'>
<start to='loadTrxns' />
<action name="loadTrxns">
<map-reduce>
<job-tracker>${jobtracker}</job-tracker>
<name-node>${namenode}</name-node>
<configuration>
<property>
<name>mapred.mapper.new-api</name>
<value>true</value>
</property>
<property>
<name>mapred.reducer.new-api</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.class</name>
<value>com.mappers.DataIngressMapper</value>
</property>
<property>
<name>mapreduce.reduce.class</name>
<value>com.reducers.DataIngressReducer</value>
</property>
.
.
.
.
</configuration>
</map-reduce>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Error</message>
</kill>
</start>
<end name="end"/>
</workflow>

Однако иногда для повышения автоматизации и эффективности может потребоваться выполнение задания потока работ (определенного в файле конфигурации в листинге 1) с учетом таких параметров, как интервалы времени, доступность данных или внешние события. Файл конфигурации координатора Oozie (см. листинг 2) позволяет инициировать задание потока работ на базе этих параметров.

Листинг 2. Файл конфигурации координатора Oozie file
<coordinator-app name="schedule_dataIngress" frequency="${frequency}" 
start="${start}" end="${end}" timezone="${timezone}" 
xmlns="uri:oozie:coordinator:0.1">
<action>
<workflow>
<app-path>${workFlowpath} </app-path>
<configuration>
<property>
<name>queueName</name>
<value>default</value>
</property>
</configuration>
</workflow>
</action>
</cordinator-app>

Изменение файлов конфигурации для Sqoop

Для программ MapReduce можно использовать эти два файла конфигурации, однако в случае использования Sqoop необходимо внести в файл конфигурации Oozie Workflow следующие изменения:

Листинг 3. Файл конфигурации Oozie с изменениями для Sqoop
<action name="loadTrxnsSqoop">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobtracker}</job-tracker>
<name-node>${namenode}</name-node>
<configuration>
<property>
<name>mapred.compress.map.output</name>
<value>true</value>
</property>
</configuration>
<command>import --connect jdbc:mysql://localhost:3333/banking_app 
--query select * from transactions t join accounts a on t.account_id = 
a.id --target-dir hdfs://localhost:8020/data/loanTrxns -m 1</command>
</sqoop>
<ok to="end"/>
<error to="fail"/>
</action>

Анализ данных в среде Hadoop

Импортировав данные в кластер Hadoop, можно приступить к их анализу. Специалисты по изучению данных обычно используют различные аналитические инструменты или приложения. Для данного примера обработки запросов на кредитование я напишу простую аналитическую программу. Популярными инструментами для анализа данных являются Pig и Hive, однако я рекомендую использовать R. И вот почему:

  • При использовании Pig и Hive для реализации алгоритмов машинного обучения необходимо писать пользовательские функции, а в R можно использовать встроенные функции R для адаптации моделей алгоритмов машинного обучения к конкретным данным. Эти функции позволяют программе отслеживать и изучать закономерности в данных и получать информацию об этих данных, а затем приложение может принимать решение о том, какие действия предпринять. В нашем примере обработки заявок на кредитование, наблюдая тенденции в данных о финансовых операциях клиента, приложение позволяет определить, можно ли предоставить ему кредит, избавляя специалиста отдела кредитования от необходимости выполнять анализ вручную для принятия решения.
  • Используя RHadoop, можно легко интегрировать мощные и в то же время простые средства анализа данных R, дополняя средства хранения и параллелизма Hadoop. А если вы пишете для анализа данных клиентское Java-приложение, вы можете использовать развитый интерфейс rJava (JRI), который прозрачно интегрирует R с Java, для вызова функций R из Java-приложений.

В примере обработки заявок на кредитование, поскольку клиентов нужно разделить на тех, кто не смог выплатить свои кредиты (неплательщики), и тех, кто выплатил свои кредиты (исправные плательщики), я разработаю приложение как бинарную классификацию и реализую контролируемое обучение. И поскольку данные необходимо сгруппировать с использованием множества параметров, я реализую алгоритм логистической регрессии. Входные данные, вероятнее всего, будут содержать параметры или признаки для объемов кредитования, ежемесячных удержаний, взысканных займов, проведенных платежей, невозвращенных кредитов и так далее. От признаков, являющихся производными других признаков, можно избавиться, чтобы признаков не было слишком много, что может приводить к переобучению — непреднамеренному моделированию случайных вариаций в данных и получению моделей, которые не работают должным образом при применении к другим наборам данных. В данном примере можно реализовать в RHadoop сценарий loanAppScript.R, подобный показанному в листинге 4.

Листинг 4. Пример сценария RHadoop для обработки заявок на кредитование
Sys.setenv(HADOOP_HOME="/home/hadoop")
Sys.setenv(HADOOP_CMD="/home/hadoop/bin/hadoop")
library(rhdfs)
library(rmr2)
hdfs.init()
loanData <- from.hdfs("/data/tmp/loanData23062014")
loanAppModel <- glm(eligible ~ F1 + F2 + F3 + F4 +.....+ F7, data=loanData,family="binomial")
predict(loanAppModel,testData,type="response")

В этом сценарии F1,.......,F7 — это признаки loanData, извлеченные из кластера Hadoop после операции ingress, а testData — выборка данных, которая содержит сведения о клиентах, включающие значения этих признаков. Результатом выполнения сценария будет значение 0 или 1, которое указывает, является клиент неплательщиком или исправным плательщиком. Кроме того, возвращается значение вероятности. Дополнительные данные, такие как отношение шансов, коэффициенты модели и интервалы достоверности, можно затем использовать для определения уровня точности модели и степени влияния каждого признака на результат анализа.

Теперь нужно интегрировать сценарий R в банковское J2EE-приложение с использованием интерфейса rJava (JRI). Но поскольку я вызываю файл сценария R, Java-код быть таким, как в листинге 5.

Листинг 5. Java-код для интеграции сценария RHadoop в J2EE-приложение
public void predictLoanApp() {
Rengine engine = Rengine.getMainEngine();
ClassPathResource rScript = new ClassPathResource("loanAppScript.R");
REXP result = rengine.eval(String.format("source('%s')",rScript.getFile().getAbsolutePath()));
Double predictedValue = result.asDouble();
}

Кроме того, поскольку я передаю в функцию параметры, представляющие тестовые данные, вызов Java-функции будет примерно таким, как Java-код в листинге 6.

Листинг 6. Java-функция для передачи параметров
	public void predictLoanApp(Object obj) {
Rengine engine = Rengine.getMainEngine();

ClassPathResource rScript = new ClassPathResource("loanAppScript.R");
rengine.eval(String.format("source('%s')",rScript.getFile().getAbsolutePath()));

rengine.eval(String.eval("testData <- data.frame(F1=%s,F2=%s,....F7=%s)",
obj.getX1(), obj.getX2(),....,obj.getX7())");

REXP result = rengine.eval(String.eval("predict(loanAppModel,testData)");
Double predictedValue = result.asDouble();
}

Объект obj — это простой Java-объект в старом стиле (Plain Old Java Object, POJO), имеющий значения для признаков, которые будут тестироваться. Такую Java-функцию можно подключить к существующему J2EE-приложению на уровне служб и использовать в любой из доступных в J2EE технологий представления, такой как JSP или JSF. Для защиты данных используйте механизмы безопасности J2EE, такие как JAAS, а для обеспечения конфиденциальности данных используйте стандартные SSL-протоколы.

Наконец, для обработки запросов, поступающих в J2EE-приложение, используйте Flume — один из инструментов среды Hadoop. Здесь я конфигурирую событие Flume для включения агента, который использует журнал сервера J2EE-приложений как источник и HDFS как приемник. Файл конфигурации Flume может выглядеть так, как показано в следующем фрагменте.

Листинг 7. Файл конфигурации Flume
# Называем компоненты этого агента
a1.sources = r1
a1.sinks = k1
a1.channels = c1

# Описываем/конфигурируем источник
a1.sources.r1.type = exec
a1.sources.r1.bind = tail -f /opt/jboss/standalone/log/server.log
a1.sources.r1.port = 44444

# Описываем приемник
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://localhost:8020/data/tmp/system.log/
a1.sinks.k1.hdfs.fileType = DataStream

# Используем канал, который буферизирует события в памяти
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Привязываем источник и приемник к каналу
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

Затем можно запустить агент такой командой:

bin/flume-ng agent --conf conf --conf-file loanApp.conf --name a1 -Dflume.root.logger=INFO,console

Заключение

В этом руководстве использовался один набор данных в одном кластере Hadoop, но можно сконфигурировать кластер Hadoop как элемент более масштабной системы, подключая его к другим системам кластеров Hadoop, или даже к облачной среде, для более обширных взаимодействий и доступа к большим объемам данных. При использовании такой инфраструктуры больших данных и приложения для анализа данных скорость обучения реализованных алгоритмов будет возрастать по мере расширения доступа к хранящимся или поступающим данным, что позволит быстрее принимать более точные бизнес-решения.


Ресурсы для скачивания


Похожие темы

  • Оригинал статьи: Integrate Hadoop with an existing RDBMS.
  • Изучите серию статей developerWorks Архитектура и шаблоны больших данных, в которой описан подход, упрощающий определение общей архитектуры больших данных.
  • Прочтите серию статей developerWorks Расширение хранилища данных, в которой описана реализация участка сбора данных для обработки больших данных.
  • Ознакомьтесь с руководством Hadoop: The Definitive Guide (Tom White, O'Reilly Media, 2015 г.), чтобы узнать, как создавать и поддерживать надежные и масштабируемые распределенные системы с использованием Apache Hadoop.
  • Прочтите книгу Hadoop in Action (Chuck Lam, Manning Publications Co., 2014 г.), чтобы узнать, как писать программы в стиле MapReduce.
  • Ознакомьтесь с техническим отчетом Hortonworks Adding Security to Apache Hadoop.
  • Посетите web-сайт Comprehensive R Archive Network, чтобы узнать о реализациях инфраструктуры R и библиотек.
  • Посетите IBM Big Data University, чтобы узнать об инструментах и технологиях для работы с большими данными.
  • Прочтите руководство Sqoop User Guide на web-сайте Apache Software Foundation, чтобы узнать больше о Sqoop.
  • Прочтите руководство Flume User Guide на web-сайте Apache Software Foundation, чтобы узнать больше о Flume.
  • Прочтите руководство Java EE 6 Tutorial для получения информации о создании J2EE-приложений.
  • Посетите web-сайт rJava (Low-level R to Java interface), чтобы узнать больше об интерфейсе rJava.

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Большие данные и аналитика
ArticleID=1020875
ArticleTitle=Интеграция Hadoop с существующей реляционной СУБД
publish-date=11122015