Использование Apache Oozie с Hadoop для определения и запуска рабочих процессов в Azure HDInsight под управлением Linux
Узнайте, как использовать Apache Oozie с Apache Hadoop в Azure HDInsight. Oozie — это система рабочих процессов и координации, управляющая заданиями Hadoop. Служба Oozie интегрирована со стеком Hadoop и поддерживает следующие задания:
- Apache Hadoop MapReduce
- Apache Pig
- Apache Hive
- Apache Sqoop
Вы также можете использовать Oozie для планирования системных заданий, например Java-программ и сценариев оболочки.
Примечание.
Еще один способ определения рабочих процессов с помощью HDInsight — использование фабрики данных Azure. Дополнительные сведения о фабрике данных см. в статье Использование данных Apache Pig and Apache Hive в фабрике данных Azure. Сведения об использовании Oozie в кластерах с Корпоративным пакетом безопасности см. в статье Запуск Apache Oozie в кластерах Hadoop HDInsight с Корпоративным пакетом безопасности.
Необходимые компоненты
Кластер Hadoop в HDInsight. Ознакомьтесь со статьей Краткое руководство. Использование Apache Hadoop и Apache Hive в Azure HDInsight с шаблоном Resource Manager.
Клиент SSH. См. статью Подключение к HDInsight (Apache Hadoop) с помощью SSH.
База данных SQL Azure. См. статью Создание базы данных в Базе данных SQL Azure с помощью портала Azure. При выполнении инструкций из этой статьи используется база данных с именем oozietest.
Схема универсального кода ресурса (URI) для основного хранилища кластеров.
wasb://
для службы хранилища Azure,abfs://
для Azure Data Lake Storage 2-го поколения илиadl://
для Azure Data Lake Storage 1-го поколения. Если для службы хранилища Azure включено безопасное перемещение, URI будет таким:wasbs://
. См. также сведения о безопасной передаче.
Пример рабочего процесса
Рабочий процесс, используемый в этой статье, включает два действия. Действия являются определениями задач, таких как запуск Hive, Sqoop, MapReduce или других процессов:
Действие Hive запускает сценарий HiveQL для извлечения записей из таблицы
hivesampletable
, входящей в состав в HDInsight. Каждая строка данных описывает посещение с определенного мобильного устройства. Формат записи таков:8 18:54:20 en-US Android Samsung SCH-i500 California United States 13.9204007 0 0 23 19:19:44 en-US Android HTC Incredible Pennsylvania United States NULL 0 0 23 19:19:46 en-US Android HTC Incredible Pennsylvania United States 1.4757422 0 1
Сценарий Hive, используемый в этом документе, подсчитывает общее количество посещений для каждой платформы (например, Android или iPhone) и сохраняет результаты в новой таблице Hive.
Дополнительные сведения о Hive см. в разделе [Использование Apache Hive с HDInsight][hdinsight-use-hive].
Действие Sqoop экспортирует содержимое новой таблицы Hive в таблицу, созданную в базе данных SQL Azure. Дополнительные сведения о Sqoop см. в статье, посвященной использованию Apache Sqoop в HDInsight.
Примечание.
Сведения о поддерживаемых версиях Oozie в кластерах HDInsight см. в статье Что представляют собой различные компоненты Hadoop, доступные в HDInsight?
Создайте рабочий каталог
В Oozie предполагается, что все ресурсы, необходимые для выполнения задания, должны находиться в том же каталоге. В этом примере используется wasbs:///tutorials/useoozie
. Чтобы создать каталог, выполните следующие шаги:
Измените приведенный ниже код, чтобы заменить
sshuser
именем пользователя SSH для кластера, и заменитеCLUSTERNAME
именем кластера. Затем введите код, чтобы подключиться к кластеру HDInsight по протоколу SSH.ssh [email protected]
Чтобы создать каталог, выполните следующую команду:
hdfs dfs -mkdir -p /tutorials/useoozie/data
Примечание.
Параметр
-p
означает, что будут созданы все каталоги для пути. В каталогеdata
хранятся данные, используемые сценариемuseooziewf.hql
.Измените приведенный ниже код для того, чтобы заменить
sshuser
именем пользователя SSH. Выполните следующую команду, чтобы убедиться, что Oozie может олицетворять учетную запись пользователя:sudo adduser sshuser users
Примечание.
Ошибки о том, что пользователь уже является членом группы
users
, можно игнорировать.
Добавление драйвера базы данных
В этом рабочем процессе для экспорта данных в базу данных SQL используется Sqoop. Поэтому необходимо предоставить копию драйвера JDBC, используемого для взаимодействия с базой данных SQL. Чтобы скопировать драйвер JDBC в рабочую папку, используйте следующую команду из сеанса SSH:
hdfs dfs -put /usr/share/java/sqljdbc_7.0/enu/mssql-jdbc*.jar /tutorials/useoozie/
Внимание
Проверьте фактический драйвер JDBC по адресу /usr/share/java/
.
Если рабочий процесс использовал другие ресурсы, например JAR-файл, содержащий приложение MapReduce, необходимо добавить и эти ресурсы.
Определение запроса Hive
Для создания сценария языка запросов Hive (HiveQL), определяющего запрос, сделайте следующее. Далее при работе с этим документом вы будете использовать запрос в рабочем процессе Oozie.
В сеансе SSH создайте файл с именем
useooziewf.hql
, выполнив следующую команду:nano useooziewf.hql
Открыв редактор GNU nano, используйте следующий запрос в качестве содержимого файла:
DROP TABLE ${hiveTableName}; CREATE EXTERNAL TABLE ${hiveTableName}(deviceplatform string, count string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '${hiveDataFolder}'; INSERT OVERWRITE TABLE ${hiveTableName} SELECT deviceplatform, COUNT(*) as count FROM hivesampletable GROUP BY deviceplatform;
В данном сценарии используются три следующие переменные:
${hiveTableName}
: содержит имя создаваемой таблицы.${hiveDataFolder}
: содержит расположения файлов данных для таблицы.Файл с определением рабочего процесса (workflow.xml в этой статье) передает эти значения в скрипт HiveQL во время выполнения.
Чтобы сохранить файл, нажмите Ctrl+X, введите Y, а затем нажмите кнопку ВВОД.
Выполните следующую команду, чтобы скопировать
useooziewf.hql
вwasbs:///tutorials/useoozie/useooziewf.hql
:hdfs dfs -put useooziewf.hql /tutorials/useoozie/useooziewf.hql
Эта команда сохраняет файл
useooziewf.hql
в HDFS-совместимом хранилище кластера.
Определение рабочего процесса
Определения рабочего процесса Oozie записываются на языке определения процессов Hadoop (hPDL), который является языком определения процессов XML. Для определения рабочего процесса выполните следующие действия.
Для создания и открытия файла выполните следующий запрос:
nano workflow.xml
Открыв редактор nano, введите следующий код XML в качестве содержимого файла:
<workflow-app name="useooziewf" xmlns="uri:oozie:workflow:0.2"> <start to = "RunHiveScript"/> <action name="RunHiveScript"> <hive xmlns="uri:oozie:hive-action:0.2"> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <script>${hiveScript}</script> <param>hiveTableName=${hiveTableName}</param> <param>hiveDataFolder=${hiveDataFolder}</param> </hive> <ok to="RunSqoopExport"/> <error to="fail"/> </action> <action name="RunSqoopExport"> <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> <arg>export</arg> <arg>--connect</arg> <arg>${sqlDatabaseConnectionString}</arg> <arg>--table</arg> <arg>${sqlDatabaseTableName}</arg> <arg>--export-dir</arg> <arg>${hiveDataFolder}</arg> <arg>-m</arg> <arg>1</arg> <arg>--input-fields-terminated-by</arg> <arg>"\t"</arg> <archive>mssql-jdbc-7.0.0.jre8.jar</archive> </sqoop> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Job failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message> </kill> <end name="end"/> </workflow-app>
В рабочем процессе определены два действия:
RunHiveScript
. Это действие запускает сценарий Hiveuseooziewf.hql
.RunSqoopExport
. Это действие экспортирует созданные данные из сценария Hive в базу данных SQL, используя Sqoop. Это действие будет выполнено только после успешного завершения действияRunHiveScript
.В рабочем процессе есть несколько записей, таких как
${jobTracker}
. Вы замените их значениями, используемыми в определении задания. Позже при выполнении инструкций из этого документа вы создадите определение задания.Также обратите внимание на параметр
<archive>mssql-jdbc-7.0.0.jre8.jar</archive>
в разделе Sqoop. Эта запись означает, что этот архив должен стать доступным для Sqoop при выполнении этого действия.
Чтобы сохранить файл, нажмите Ctrl+X, введите Y, а затем нажмите кнопку ВВОД.
Выполните следующую команду, чтобы скопировать файл
workflow.xml
в/tutorials/useoozie/workflow.xml
.hdfs dfs -put workflow.xml /tutorials/useoozie/workflow.xml
Создание таблицы
Примечание.
Существует множество способов подключения к базе данных SQL для создания таблицы. В приведенных ниже действиях используется FreeTDS из кластера HDInsight.
Для установки FreeTDS в кластер HDInsight воспользуйтесь следующей командой:
sudo apt-get --assume-yes install freetds-dev freetds-bin
Измените приведенный ниже код, чтобы заменить
<serverName>
именем логического сервера SQL Server, а<sqlLogin>
— учетными данными сервера. Введите команду для подключения к необходимой базе данных SQL. Введите пароль в командной строке.TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
Выводятся сведения следующего вида:
locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" Default database being set to oozietest 1>
В командной строке
1>
введите следующее:CREATE TABLE [dbo].[mobiledata]( [deviceplatform] [nvarchar](50), [count] [bigint]) GO CREATE CLUSTERED INDEX mobiledata_clustered_index on mobiledata(deviceplatform) GO
Если вводится инструкция
GO
, то оцениваются предыдущие инструкции. С помощью этих инструкций создается таблицаmobiledata
, используемая рабочим процессом.Используйте следующие команды для проверки создания таблицы:
SELECT * FROM information_schema.tables GO
Выводятся сведения следующего вида:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE oozietest dbo mobiledata BASE TABLE
Выйдите из служебной программы tsql, введя
exit
в командной строке1>
.
Создание определения задания
Определение задания содержит информацию о местонахождении файла workflow.xml, а также о том, где можно найти другие файлы, используемые рабочим процессом, например useooziewf.hql
. Кроме того, в нем определяются значения свойств, используемых в рабочем процессе, и сопутствующих файлов.
Для получения полного адреса хранилища по умолчанию, воспользуйтесь указанной ниже командой. Этот адрес используется в файле конфигурации, который вы создадите на следующем шаге.
sed -n '/<name>fs.default/,/<\/value>/p' /etc/hadoop/conf/core-site.xml
Эта команда возвращает информацию, как в следующем коде XML:
<name>fs.defaultFS</name> <value>wasbs://[email protected]</value>
Примечание.
Если кластер HDInsight использует службу хранилища Azure в качестве хранилища по умолчанию, содержимое элемента
<value>
начинается сwasbs://
. Если используется Data Lake Storage 1-го поколения, оно начинается сadl://
. Если используется Data Lake Storage 2-го поколения, оно начинается сabfs://
.Сохраните содержимое элемента
<value>
, которое потребуется нам на следующих шагах.Измените приведенный ниже XML-код следующим образом:
Значение заполнителя Замененное значение wasbs://[email protected] Значение, полученное на шаге 1. администрирование Имя для входа в кластер HDInsight, если вы не являетесь администратором. serverName Имя сервера Базы данных SQL Azure. sqlLogin Учетные данные для сервера Базы данных SQL Azure sqlPassword Пароль для входа на сервер Базы данных SQL Azure. <?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>nameNode</name> <value>wasbs://[email protected]</value> </property> <property> <name>jobTracker</name> <value>headnodehost:8050</value> </property> <property> <name>queueName</name> <value>default</value> </property> <property> <name>oozie.use.system.libpath</name> <value>true</value> </property> <property> <name>hiveScript</name> <value>wasbs://[email protected]/tutorials/useoozie/useooziewf.hql</value> </property> <property> <name>hiveTableName</name> <value>mobilecount</value> </property> <property> <name>hiveDataFolder</name> <value>wasbs://[email protected]/tutorials/useoozie/data</value> </property> <property> <name>sqlDatabaseConnectionString</name> <value>"jdbc:sqlserver://serverName.database.windows.net;user=sqlLogin;password=sqlPassword;database=oozietest"</value> </property> <property> <name>sqlDatabaseTableName</name> <value>mobiledata</value> </property> <property> <name>user.name</name> <value>admin</value> </property> <property> <name>oozie.wf.application.path</name> <value>wasbs://[email protected]/tutorials/useoozie</value> </property> </configuration>
Большая часть информации в этом файле используется для заполнения значений, используемых в файлах workflow.xml или ooziewf.hql, таких как
${nameNode}
. Если используется путьwasbs
, его необходимо указать полностью. Не сокращайте его до строкиwasbs:///
. Записьoozie.wf.application.path
определяет, где можно найти файл workflow.xml. Этот файл содержит рабочий процесс, запущенный этим заданием.Используйте следующую команду для создания конфигурации определения задания Oozie:
nano job.xml
Открыв редактор nano, вставьте измененный код XML в качестве содержимого файла.
Чтобы сохранить файл, нажмите Ctrl+X, введите Y, а затем нажмите кнопку ВВОД.
Отправка задания и управление им
Далее используется команда Oozie для отправки рабочих процессов Oozie в кластер и управления ими. Команда Oozie предоставляет удобный интерфейс для Oozie REST API.
Внимание
При использовании команды Oozie необходимо использовать полное доменное имя для головного узла HDInsight. Это полное доменное имя доступно только из кластера или, если кластер находится в виртуальной сети Azure, с других компьютеров той же сети.
Для получения URL-адреса службы Oozie, воспользуйтесь следующей командой:
sed -n '/<name>oozie.base.url/,/<\/value>/p' /etc/oozie/conf/oozie-site.xml
Эта команда возвращает информацию, как в следующем коде XML:
<name>oozie.base.url</name> <value>http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie</value>
Здесь фрагмент
http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie
обозначает URL-адрес, который используется в команде Oozie.Измените код, чтобы заменить URL-адрес полученным ранее. Используйте следующую команду для создания переменной среды для URL-адреса, чтобы не вводить его в каждой команде:
export OOZIE_URL=http://HOSTNAMEt:11000/oozie
Чтобы отправить задание, воспользуйтесь следующим кодом:
oozie job -config job.xml -submit
Эта команда загружает сведения о задании из
job.xml
и отправляет их в Oozie, но не запускает задание.После завершения команда должна вернуть идентификатор задания, например
0000005-150622124850154-oozie-oozi-W
. Этот идентификатор используется для управления заданием.Измените приведенный ниже код, чтобы заменить
<JOBID>
идентификатором, возвращенным на предыдущем шаге. Чтобы просмотреть состояние задания, используйте следующую команду:oozie job -info <JOBID>
Эта команда возвращает следующую информацию:
Job ID : 0000005-150622124850154-oozie-oozi-W ------------------------------------------------------------------------------------------------------------------------------------ Workflow Name : useooziewf App Path : wasb:///tutorials/useoozie Status : PREP Run : 0 User : USERNAME Group : - Created : 2015-06-22 15:06 GMT Started : - Last Modified : 2015-06-22 15:06 GMT Ended : - CoordAction ID: - ------------------------------------------------------------------------------------------------------------------------------------
Это задание находится в состоянии
PREP
, Это состояние указывает на то, что задание было создано, но не запущено.Измените приведенный ниже код, чтобы заменить
<JOBID>
идентификатором, возвращенным ранее. Для запуска задания выполните следующую команду:oozie job -start <JOBID>
Если вы проверите состояние после этой команды, то увидите состояние выполнения и информацию о действиях для этого задания. Это задание может занять несколько минут.
Измените приведенный ниже код, чтобы заменить
<serverName>
именем сервера, а<sqlLogin>
— учетными данными сервера. После успешного завершения задания с помощью следующих команд можно удостовериться, что данные были созданы и экспортированы в таблицу базы данных SQL. Введите пароль в командной строке.TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
В командной строке
1>
введите следующий запрос.SELECT * FROM mobiledata GO
При этом возвращается следующая информация:
deviceplatform count Android 31591 iPhone OS 22731 proprietary development 3 RIM OS 3464 Unknown 213 Windows Phone 1791 (6 rows affected)
Дополнительные сведения о команде Oozie см. на странице, посвященной программе командной строки Apache Oozie.
Oozie REST API
Oozie REST API позволяет создавать собственные утилиты для работы с Oozie. Ниже приведена информация об использовании Oozie REST API для HDInsight:
URI. Вы можете получить доступ к REST API из-за пределов кластера по адресу
https://CLUSTERNAME.azurehdinsight.net/oozie
.Аутентификация. Для аутентификации используйте API, учетную запись кластера HTTP (администратор) и пароль. Например:
curl -u admin:PASSWORD https://CLUSTERNAME.azurehdinsight.net/oozie/versions
Дополнительные сведения об использовании Oozie REST API см. в статье об API веб-служб Apache Oozie.
веб-интерфейс Oozie
Веб-интерфейс Oozie позволяет получить информацию о состоянии задания Oozie в кластере. С помощью веб-интерфейса вы можете просмотреть следующую информацию:
- Состояние задания
- определение задания;
- Настройка
- диаграмму действий задания;
- журналы задания.
Кроме того, можно просмотреть подробную информацию о действиях в рамках задания.
Для доступа к веб-интерфейсу Oozie сделайте следующее:
Создайте туннель SSH для кластера HDInsight. Дополнительные сведения см. в статье Использование туннелирования SSH с для доступа к веб-интерфейсу Ambari, JobHistory, NameNode, Oozie и другим веб-интерфейсам.
После создания туннеля откройте веб-интерфейс Ambari в браузере с помощью универсального кода ресурса (URI)
http://headnodehost:8080
.В левой части страницы выберите Oozie>Быстрые ссылки>Oozie Web UI (Веб-интерфейс Oozie).
По умолчанию в веб-интерфейсе Oozie отображаются запущенные задания рабочих процессов. Чтобы просмотреть все задания рабочего процесса, выберите All Jobs (Все задания).
Чтобы просмотреть дополнительные сведения о задании, выберите это задание.
На вкладке Job Info (Сведения о задании) можно просмотреть базовую информацию о задании, а также отдельные действия в рамках задания. С помощью вкладок вверху можно просмотреть определение задания, конфигурацию задания, обратиться к журналу задания или просмотреть направленный ациклический граф (DAG) задания в разделе Job DAG (Направленный ациклический граф задания).
Job Log (Журнал задания). Нажмите кнопку Get Logs (Получить журналы) для просмотра всех журналов задания или воспользуйтесь полем Enter Search Filter (Введите фильтр поиска) для выбора журналов с помощью фильтра.
Job DAG (Направленный ациклический граф задания). DAG представляет собой графическое отображение путей данных рабочего процесса.
Выбрав одно из действий на вкладке Job Info (Сведения о задании), вы увидите информацию об этом действии. Например, выберите действие RunSqoopExport.
Вы можете просмотреть подробную информацию о действии, например ссылку на URL-адрес консоли. Используйте эту ссылку для просмотра сведений о задании в средстве отслеживания заданий.
Планирование заданий
Вы можете использовать координатор, чтобы указать время начала, окончания и частоту выполнения заданий. Чтобы задать расписание для рабочего процесса, выполните следующие действия:
Выполните следующую команду для создания файла с именем coordinator.xml:
nano coordinator.xml
Используйте следующий код XML в качестве содержимого файла:
<coordinator-app name="my_coord_app" frequency="${coordFrequency}" start="${coordStart}" end="${coordEnd}" timezone="${coordTimezone}" xmlns="uri:oozie:coordinator:0.4"> <action> <workflow> <app-path>${workflowPath}</app-path> </workflow> </action> </coordinator-app>
Примечание.
При запуске задания переменные
${...}
будут заменены значениями, указанными в определении задания. Используются следующие переменные:${coordFrequency}
: интервал времени между запуском повторных экземпляров задания.${coordStart}
: время запуска задания.${coordEnd}
: время завершения задания.${coordTimezone}
: задания координатора задаются для конкретного часового пояса без летнего времени (обычно представляется в виде времени в формате UTC). Этот часовой пояс называется часовым поясом обработки Oozie.${wfPath}
: путь к файлу workflow.xml.
Чтобы сохранить файл, нажмите Ctrl+X, введите Y, а затем нажмите кнопку ВВОД.
Чтобы скопировать этот файл в рабочий каталог задания, воспользуйтесь следующей командой:
hadoop fs -put coordinator.xml /tutorials/useoozie/coordinator.xml
Чтобы изменить файл
job.xml
, созданный ранее, используйте следующую команду:nano job.xml
Внесите следующие изменения:
Чтобы служба Oozie запускала файл координатора вместо файла рабочего процесса, измените
<name>oozie.wf.application.path</name>
на<name>oozie.coord.application.path</name>
.Чтобы задать переменную
workflowPath
, используемую координатором, добавьте следующий код XML:<property> <name>workflowPath</name> <value>wasbs://[email protected]/tutorials/useoozie</value> </property>
Замените текст
wasbs://[email protected]
значением, которое используется в других записях файла job.xml.Чтобы определить начало, окончание и частоту выполнения для координатора, добавьте следующий код XML:
<property> <name>coordStart</name> <value>2018-05-10T12:00Z</value> </property> <property> <name>coordEnd</name> <value>2018-05-12T12:00Z</value> </property> <property> <name>coordFrequency</name> <value>1440</value> </property> <property> <name>coordTimezone</name> <value>UTC</value> </property>
Приведенные выше значения задают время начала — 12:00 часов 10 мая 2018 года и время окончания — 12 мая 2018 года. Интервал запуска этого задания — "ежедневно". Интервал задается в минутах, то есть 24 часа x 60 минут = 1440 минут. И наконец, часовой пояс устанавливается в формате UTC.
Чтобы сохранить файл, нажмите Ctrl+X, введите Y, а затем нажмите кнопку ВВОД.
Чтобы отправить и запустить задание, выполните следующую команду:
oozie job -config job.xml -run
Если вы зайдете в веб-интерфейс Oozie и выберете вкладку Coordinator Jobs (Задания координатора), то увидите похожую информацию:
Запись Next Materialization (Следующая материализация) определяет момент следующего запуска задания.
Как и для предыдущих заданий рабочего процесса, если вы выберете это задание в веб-интерфейсе, то увидите информацию о нем:
Примечание.
На этом изображении показаны только сведения об успешных запусках задания, а не сведения об отдельных действиях запланированного рабочего процесса. Для просмотра отдельных действий выберите одну из записей Action (Действие).
Следующие шаги
Из этой статьи вы узнали, как задать рабочий процесс Oozie и как запустить задание Oozie. Дополнительные сведения о работе с HDInsight приведены в следующих статьях: