hadoop oozie_适用于Hadoop的Oozie工作流调度程序

hadoop oozie

什么是Oozie?

Apache Oozie是基于Java™技术的开源项目,可简化创建工作流和管理作业之间协调的过程。 原则上,Oozie提供了将多个作业依次组合为一个逻辑工作单元的功能。 Oozie框架的优点之一是,它与Apache Hadoop堆栈完全集成,并支持Apache MapReduce,Pig,Hive和Sqoop的Hadoop作业。 此外,它还可用于计划特定于系统的作业,例如Java程序。 因此,使用Oozie,Hadoop管理员能够构建复杂的数据转换,该转换可以结合对不同的单个任务甚至子工作流的处理。 此功能可以更好地控制复杂的作业,并更容易在预定时间重复执行这些作业。

实际上,Oozie作业有不同类型:

  • Oozie Workflow作业-用有向无环图表示,以指定要执行的动作序列。
  • Oozie协调器作业-代表由时间和数据可用性触发的Oozie工作流作业。
  • Oozie Bundle-便于打包多个协调器和工作流作业,并使管理这些作业的生命周期更加容易。

Oozie如何工作?

Oozie工作流是按有向无环图(DAG)排列的动作的集合。 该图可以包含两种类型的节点:控制节点和动作节点。 用于定义作业时间顺序的控制节点提供了用于开始和结束工作流程的规则,并使用称为fork和join节点的可能决策点控制工作流程的执行路径。 动作节点用于触发任务的执行。 特别地,动作节点可以是MapReduce作业,Pig应用程序,文件系统任务或Java应用程序。 (不建议使用shell和ssh操作)。

Oozie是本机Hadoop堆栈集成,支持所有类型的Hadoop作业,并与Hadoop堆栈集成。 特别是,Oozie负责触发工作流操作,而任务的实际执行是使用Hadoop MapReduce完成的。 因此,Oozie能够利用现有的Hadoop机械进行负载平衡,故障转移等。Oozie通过回调和轮询来检测任务的完成。 Oozie启动任务时,它将为任务提供唯一的回调HTTP URL,并在完成时通知该URL。 如果任务无法调用回调URL,Oozie可以轮询任务以完成任务。 图1展示了一个示例Oozie工作流,该工作流结合了六个动作节点(Pig脚本,MapReduce作业,Java代码和HDFS任务)和五个控制节点(开始,决策控制,Fork,Join和End)。 Oozie工作流程也可以参数化。 提交工作流程作业时,必须提供参数值。 如果使用适当的参数,则可以同时发生几个相同的工作流程作业。

图1. Oozie示例工作流
该图显示了示例Oozie工作流程

在实践中,有时有必要在规则的时间间隔内运行Oozie工作流,但要与其他条件(例如特定数据的可用性或任何其他事件或任务的完成)配合使用。 在这些情况下,Oozie Coordinator作业允许用户以数据,时间或事件谓词的形式对工作流执行触发器进行建模,并在满足条件后启动工作流作业。 Oozie协调器还可以管理多个工作流程,这些工作流程取决于后续工作流程的结果。 后续工作流程的输出将成为下一个工作流程的输入。 该链称为数据应用程序管道 。

Oozie工作流定义语言是基于XML的,它被称为Hadoop流程定义语言。 Oozie带有用于提交作业的命令行程序。 该命令行程序使用REST与Oozie服务器进行交互。 要使用Oozie客户端提交或运行作业,请向Oozie提供HDFS中您工作流.xml文件的完整路径作为客户端的参数。 Oozie没有全局属性的概念。 所有属性,包括jobtracker和namenode ,都必须作为每个作业运行的一部分提交。 Oozie使用RDBMS来存储状态。

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>

这个简单的工作流程定义了三个动作: ingestormergeT1mergeT2 。 每个操作都作为MapReduce作业实现。 如图2所示,工作流从起始节点开始,该起始节点将控制权转移到ingestor动作。 摄取器步骤完成后,将调用派生控制节点,这是一个开始并行执行mergeT1mergeT2的操作。 一旦完成两个动作,就将调用加入控制节点。 成功完成加入节点后,控件将传递到结束节点,该步骤将结束该过程。 <job-tracker><name-node>实体指示Hive作业将连接到服务器以执行其脚本。

图2.清单1的工作流图示
该图显示了示例Oozie工作流程

现在让我们看一下另一个包含Hive作业的Oozie工作流示例。

清单2.包含Hive作业的Oozie工作流程
<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循环工作流
<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)方法每小时执行一次。 使用代码jobStartjobEndvariables指定作业的开始时间和结束时间。 数据集实体指定一组输入数据的位置。 在这种情况下,存在一个称为InputData的数据集,该数据集按频率指定每小时更新一次。 对于Hive工作流程的每次执行,都会从输入数据集指定的初始实例开始,单独输入数据集的实例。 YEAR, MONTH, DAY,HOUR是用于参数化数据集URI模板的变量。 done标志指定一个文件,该文件确定何时完成数据集的生成。

结论

在实际实践中,帮助Hadoop用户将大数据处理任务链接和自动执行到定义的工作流程中是非常有用的功能。 在本文中,向您介绍了Oozie,这是一个Apache开源项目,可简化创建工作流的过程以及基于Hadoop的作业之间的协调。 但是,Oozie并不是唯一可以帮助您实现此目标的项目。 其他项目包括Azkaban (由LinkedIn编写和开源), Luigi (基于Python的工作流引擎)和Cascading (支持任何基于JVM的语言,例如Java,JRuby和Clojure)。 如果你已经准备好开始使用了Oozie及其各种功能和设施,请参阅相关主题以获取更多信息和资源。


翻译自: https://www.ibm.com/developerworks/opensource/library/bd-ooziehadoop/index.html

hadoop oozie

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值