Oozie – диспетчер потоков работ для платформы Hadoop

Введение

Большие данные в необработанном виде редко соответствуют требованиям Hadoop-разработчика к данным, соблюдение которых необходимо для успешного выполнения задач обработки данных. Обычно перед выполнением любых реальных заданий по обработке данных необходимо применять различные ETL-операции (extract/transform/load - извлечение/преобразование/загрузка) и операции предварительной обработки. Oozie— это инфраструктура, которая помогает автоматизировать этот процесс. Она представляет эту работу в виде воспроизводимых единиц или потоков работ, которые впоследствии можно многократно использовать без написания какого-либо нового кода или новых процедур. В статье описывается применение Oozie при создании различных типов потоков работ.

Шериф Сакр, старший научный сотрудник Австралийского национального института информационных и коммуникационных технологий, независимый специалист

Photo of Sherif SakrДоктор Шериф Сакр (Sherif Sakr) – старший научный сотрудник группы систем программного обеспечения в Австралийском национальном институте информационных и коммуникационных технологий (NICTA), г. Сидней. Также он совмещает должность старшего преподавателя школы компьютерных и технических наук в Университете Нового Южного Уэльса. В 2007 году Шериф получил докторскую степень в области компьютерных наук в Университете г. Констанца, Германия. Также имеет степени бакалавра и магистра компьютерных наук Каирского университета, Египет. В 2011 году занимал должность выездного научного работника группы Computing Group (XCG) подразделения Microsoft Research в Редмонде, штат Вашингтон. В 2012 году работал в штате исследователей корпорации Alcatel-Lucent Bell Labs.



07.04.2014

Что такое Oozie?

Apache Oozie — это проект с открытым исходным кодом на основе технологии Java™, упрощающий процесс создания потоков работ и координацию заданий. Oozie предоставляет принципиальную возможность объединения нескольких последовательно выполняемых заданий в одну логическую единицу работы. Одно из преимуществ инфраструктуры Oozie состоит в том, что она полностью интегрирована со стеком Apache Hadoop и поддерживает задания Hadoop для Apache MapReduce, Pig, Hive и Sqoop. Кроме того, ее можно применять для планирования заданий с учетом специфики системы, например, Java-программ. Oozie позволяет Hadoop-администраторам создавать сложные преобразования данных, способные объединять обработку разнообразных индивидуальных задач и даже подпотоков работ. Такая возможность улучшает контролируемость сложных заданий и облегчает повторение этих заданий с заранее заданными интервалами.

На практике существуют различные типы заданий Oozie.

  • Задания типа Oozie Workflow— представляются в виде ориентированных ациклических графов, задающих последовательность выполняемых действий.
  • Задания типа Oozie Coordinator— представляют задания потока работ Oozie, инициируемые по времени и по доступности данных.
  • Задание типа Oozie Bundle— облегчает упаковку нескольких заданий типа Oozie Workflow и Oozie Workflow; упрощает управление жизненным циклом этих заданий.

Как работает Oozie?

Поток работ Oozie представляет собой коллекцию действий, организованных в виде ориентированного ациклического графа (directed acyclic graph, DAG). Этот граф может содержать два типа узлов: узлы управления (control node) и узлы действия (action node). Узлы управления, которые используются для определения временной последовательности заданий, предоставляют правила для начала и окончания потока работ, а также управляют последовательностью выполнения потока работ с помощью точек принятия возможных решений, в качестве которых используются узлы ветвления (fork node) и узлы соединения (join node). Узлы действия используются для инициирования выполнения (включения) задач. В частности, узел действия может представлять собой MapReduce-задание, Pig-приложение, задачу файловой системы или Java-приложение (действия shell и ssh применять не рекомендуется).

Инфраструктура Oozie использует собственную реализацию стека Hadoop, которая поддерживает все типы заданий Hadoop и интегрирована с обычным стеком Hadoop. В частности, Oozie отвечает за инициирование действий потока работ, а фактическое выполнение задач осуществляется с помощью Hadoop MapReduce. Это позволяет Oozie использовать существующие Hadoop-механизмы для выравнивания нагрузки, для переключения при отказе и т.д. Oozie обнаруживает завершение задач посредством таких механизмов, как обратный вызов (callback) и опрос (polling). Когда инфраструктура Oozie запускает какую-либо задачу, она предоставляет ей уникальный HTTP URL для обратного вызова, а после завершения выполнения этой задачи отсылает по этому URL соответствующее уведомление. Если задача не может выполнить обратный вызов по этому URL, инфраструктура Oozie опрашивает эту задачу на предмет ее завершения. На рис.1 показан пример потока работ Oozie, включающий шесть узлов действия (Pig-скрипт, MapReduce-задания (MR), Java-код, HDFS-задача) и пять узлов управления (Start, Decision, Fork, Join, End). Кроме того, потоки работ Oozie могут быть снабжены параметрами ("параметризированы"). При отправке задания потока работ необходимо задать соответствующие значения для этих параметров. При использовании надлежащих параметров несколько идентичных заданий потоков работ могут выполняться одновременно.

Рисунок 1. Пример потока работ Oozie
Image shows sample Oozie workflow

На практике иногда необходимо выполнять задания типа Oozie Workflow с регулярными временными интервалами, но в координации с другими условиями, такими как доступность определенных данных или завершение каких-либо других событий или задач. В этих ситуациях задания типа Oozie Coordinator позволяют пользователю моделировать триггеры выполнения потока работ в форме предикатов данных, времени или событий. При этом задания потока работ будут запускаться после удовлетворения соответствующих предикатов. Задание Oozie Coordinator также может управлять несколькими потоками работ, которые зависят от результатов последующих потоков работ. Выходные результаты последующих потоков работ становятся входными данными для очередного потока работ. Эта цепочка носит название data application pipeline (конвейер применения данных).

Язык для определения потока работ Oozie базируется на технологии XML и носит название Hadoop Process Definition Language. В комплект поставки Oozie входит программа командной строки для отправки заданий. Эта программа взаимодействует с Oozie-сервером посредством REST. Чтобы отправить или выполнить задание с использованием клиента Oozie, предоставьте инфраструктуре Oozie полный маршрут к своему файлу workflow.xml в HDFS в качестве параметра для клиента Oozie. В Oozie отсутствует понятие глобальных свойств. Все свойства, в том числе jobtracker и namenode, необходимо отправлять в составе каждого выполняемого задания. Для сохранения состояния в Oozie используется реляционная СУБД.


Oozie в действии

Используем поток работ Oozie для выполнения повторяющегося задания. Потоки работ Oozie представлены в виде XML-файла, описывающего ориентированный ациклический граф. Рассмотрим следующий пример простого потока работ, связывающего в цепочку два MapReduce-задания. Первое задание выполняет первоначальный прием данных, а второе задание — слияние данных указанного типа.

Листинг 1. Пример простого потока работ Oozie
<workflow-app xmlns='uri:oozie:workflow:0.1' name='SimpleWorkflow'>
	<start to='ingestor'/>
	<action name='ingestor'>
		</java>
			<job-tracker>${jobTracker}</job-tracker>
			<name-node>${nameNode}</name-node>
			<configuration>
				<property>
					<name>mapred.job.queue.name</name>
					<value>default</value>
				</property>
			</configuration>
			<arg>${driveID}</arg>
		</java>
		<ok to='merging'/>
		<error to='fail'/>
	</action>
	<fork name='merging'>
		<path start='mergeT1'/>
		<path start='mergeT2'/>
	</fork>
	<action name='mergeT1'>
		<java>
			<job-tracker>${jobTracker}</job-tracker>
			<name-node>${nameNode}</name-node>
			<configuration>
				<property>
					<name>mapred.job.queue.name</name>
					<value>default</value>
				</property>
			</configuration>
			<arg>-drive</arg>
			<arg>${driveID}</arg>
			<arg>-type</arg>
			<arg>T1</arg>
		</java>
		<ok to='completed'/>
		<error to='fail'/>
	</action>
	<action name='mergeT2'>
		<java>
			<job-tracker>${jobTracker}</job-tracker>
			<name-node>${nameNode}</name-node>
			<configuration>
				<property>
					<name>mapred.job.queue.name</name>
					<value>default</value>
				</property>
			</configuration>
			<main-class>com.navteq.assetmgmt.hdfs.merge.MergerLoader</main-class>
			<arg>-drive</arg>
			<arg>${driveID}</arg>
			<arg>-type</arg>
			<arg>T2</arg>
		</java>
		<ok to='completed'/>
		<error to='fail'/>
	</action>
	<join name='completed' to='end'/>
	<kill name='fail'>
		<message>Java failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
	</kill>
	<end name='end'/>
</workflow-app>

В этом простом потоке работ определяются три действия: ingestor, mergeT1, mergeT2. Каждое действие реализовано как MapReduce-задание. Как показано на рис. 2, поток работ начинается с узла Start, который передает управление действию ingestor. После завершения шага Ingestor вызывается узел управления Fork. Это действие запускает параллельное выполнение MapReduce-заданий mergeT1 и mergeT2. После выполнения обоих действий вызывается узел управления Join. После успешного завершения работы узла Join управление передается узлу End, который заканчивает процесс. Сущности <job-tracker> и <name-node> указывают, к каким серверам должно подключиться Hive-задание для исполнения своего скрипта.

Рисунок 2. Диаграмма потока работ, описанного в листинге 1
Image shows sample Oozie workflow

Теперь рассмотрим другой пример потока работ Oozie, в состав которого входит Hive-задание.

Листинг 2. Поток работ Oozie, включающий Hive-задание.
<workflow-app xmlns='uri:oozie:workflow:0.1' name='Hive-Workflow'>
	<start to='hive-job'/>
	<action name='hive-job'>
		<hive xmlns='uri:oozie:hive-action:0.4'>
			<job-tracker>${jobTracker}</job-tracker>
			<name-node>${nameNode}</name-node>
			<prepare>
				<delete path='${workflowRoot}/output-data/hive'/>
				<mkdir path='${workflowRoot}/output-data'/>
			</prepare>
			<job-xml>${workflowRoot}/hive-site.xml</job-xml>
			<configuration>
				<property>
					<name>oozie.hive.defaults</name>
					<value>${workflowRoot}/hive-site.xml</value>
				</property>
			</configuration>
			<script>hive_script.q</script>
			<param>JSON_SERDE=${workflowRoot}/lib/hive-serdes-1.0-SNAPSHOT.jar</param>
			<param>PARTITION_PATH=${workflowInput}</param>
			<param>DATEHOUR=${dateHour}</param>
		</hive>
		<ok to='end'/>
		<error to='fail'/>
	</action>
	<kill name='fail'>
		<message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
	</kill>
	<end name='end'/>
</workflow-app>

В этом потоке работ мы описываем действие как Hive-действие со следующим узлом: <hive xmlns='uri:oozie:hive-action:0.4'>. Сущность <job-xml> указывает конфигурационный файл для Hive.

Наконец, рассмотрим еще один пример Oozie, в котором осуществляется диспетчеризация повторяющихся потоков работ.

Листинг 3. Повторяющиеся потоки работ Oozie

Кликните, чтобы увидеть код

Листинг 3. Повторяющиеся потоки работ Oozie

<coordinator-app name='Hive-workglow' frequency='${coord:hours(1)}'
start='${jobStart}' end='${jobEnd}'
timezone='UTC'
xmlns='uri:oozie:coordinator:0.1'>
<datasets>
	<dataset name='InputData' frequency='${coord:hours(1)}'
initial-instance='${initialDataset}' timezone='America/Los_Angeles'>
		<uri-template>
			hdfs://hadoop1:8020/user/flume/InputData/${YEAR}/${MONTH}/${DAY}/${HOUR}
		</uri-template>
		<done-flag></done-flag>
	</dataset>
</datasets>
<input-events>
	<data-in name='InputData ' dataset='Data'>
		<instance>${coord:current(coord:tzOffset() / 60)}</instance>
	</data-in>
	<data-in name='readyIndicator' dataset='tweets'>
		<instance>${coord:current(1 + (coord:tzOffset() / 60))}</instance>
	</data-in>
</input-events>
<action>
	<workflow>
		<app-path>${workflowRoot}/ Hive-Workflow.xml</app-path>
		<configuration>
			<property>
				<name>workflowInput</name>
				<value>${coord:dataIn('InputData')}</value>
			</property>
			<property>
				<name>dateHour</name>
				<value>${coord:formatTime(coord:dateOffset(coord:nominalTime(), tzOffset, 'HOUR'), 'yyyyMMddHH')}</value>
			</property>
		</configuration>
	</workflow>
</action>
</coordinator-app>

В этом примере поток работ с Hive-заданием из предыдущего примера сконфигурирован для исполнения каждый час с помощью метода coord:hours(1). Моменты запуска и окончания задания задаются с помощью переменных jobStart и jobEndvariables. Сущность datasets указывает местоположение набора входных данных. В данном случае имеется набор данных с именем InputData, который обновляется каждый час (в соответствии с указанной частотой). Для каждого исполнения этого потока работ Hive будет существовать отдельный экземпляр входного набора данных (начиная с исходного экземпляра, указанного в наборе данных). Переменные YEAR, MONTH, DAY, и HOUR используются для параметризации шаблона URI для этого набора данных. Флаг done указывает на файл, определяющий готовность генерируемого набора данных.


Заключение

Инструментарий для связывания в цепочку и автоматизации выполнения задач обработки больших данных в рамках определенного потока работ — весьма полезная опция для пользователей платформы Hadoop при решении практических задач. В этой статье вы познакомились с Apache-проектом с открытым исходным кодом Oozie, который упрощает процесс создания потоков работ и координации Hadoop-заданий. Однако Oozie — это далеко не единственный проект, который можно использовать для достижения этой цели. К числу других проектов этой категории относятся Azkaban (продукт с открытым исходным кодом, первоначально созданный компанией LinkedIn), Luigi (механизм на базе Python для поддержки потоков работ) и Cascading (поддерживает все JVM-языки, в том числе Java, JRuby и Clojure). Если вы готовы приступить к работе с инфраструктурой Oozie и желаете ознакомиться с ее разнообразными характеристиками и возможностями, обратитесь к разделу Ресурсы за более подробной информацией и ссылками на дополнительные ресурсы.

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=967835
ArticleTitle=Oozie – диспетчер потоков работ для платформы Hadoop
publish-date=04072014