@xtccc
2016-01-20T05:32:41.000000Z
字数 5411
阅读 4752
Oozie
本文适用版本: Oozie 4.1.0
目录
Action
一个执行/计算任务(例如一个MR Job, 一个shell command等),也可以称为 task 或者 action node。
Workflow
一个依赖关系图中的一系列相关actions。如果action A 到action B之间存在“依赖关系”,那么只有A完成之后,B才能开始。
定义workflow的语言是XML,称为hPDL(Hadoop Process Definition Language)。
一个workflow app是一个ZIP文件,包含workflow定义(一个xml文件)以及运行actions所需的全部文件(jar files for MR job, shell for streaming MR job, native libraries, Pig scripts, etc.)
一个workflow job可以有以下状态:
一个workflow实际上就是由控制流节点(control flow nodes)和动作节点(action nodes)构成的DAG。
Control flow nodes
可以定义workflow的开始/结束(start、end、kill nodes),也可以控制workflow job的执行路径(decision、fork、join nodes)。
Action nodes
用于触发计算/处理任务的执行,它包括:map-reduce, pig, etc。
下面具体介绍这些nodes。
start
start是workflow job的入口,一个workflow必须定义start节点。
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">...<start to="[NODE-NAME]"/>...</workflow-app>
end
end节点是workflow job的终点,它表示workflow成功结束,一个workflow job必须定义end节点。
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">...<end name="[NODE-NAME]"/>...</workflow-app>
当workflow到达end节点时,如果还有actions在运行,那么这些actions将被killed,在这种情况下该workflow job仍然被认为是成功运行结束了。
kill
kill节点允许一个workflow job杀死自己,此时它处于KILLED状态,一个workflow可以没有kill节点。。
<workflow-app name="[WF-DEF-NAME]">...<kill name="[NODE-NAME]"><message>[MESSAGE-TO-LOG]</message></kill>...</workflow-app>
当一个workflow job到达kill节点时,如果其他actions还在运行,则这些actions将被killed。
decision
decision节点使得workflow可以选择执行路径,我们可以将这个节点视为switch-case。
<workflow-app name="[WF-DEF-NAME]">...<decision name="[NODE-NAME]"><switch><case to="[NODE-NAME]">[PREDICATE]</case><case to="[NODE-NAME]">[PREDICATE]</case>...<case to="[NODE-NAME]">[PREDICATE]</case><default to="[NODE-NAME]">[PREDICATE]</case></switch></decision>...</workflow-app>
各个cases按照它们出现的顺序进行评估,如果都不满足(即都不返回true),则执行default case。
PREDICATE是JSP Expression Language(EL)表达式,例如
${fs:filesize('/path/to/file') gt 10 * GB}或者${hadoop:counters('secondjob')[RECORDS][REDUCE_OUTPUT] lt 10000}
fork / join
fork节点将一个执行流变为多个并发的执行流,join节点则会等待,直到前一个fork引发的全部执行流都运行结束。这两个节点必须成对使用。
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">...<fork name="[FORK-NODE-NAME]"><path start="[NODE-NAME]"/><path start="[NODE-NAME]"/>...<path start="[NODE-NAME]"/></fork><join name="[JOIN-NODE-NAME]" to="[NODE-NAME]"/>...</workflow-app>
在默认情况下,Oozie会在检测一个workflow中的fork-join的正确性,如果不正确的话则不会提交该workflow。但也是可能Oozie认为某个fork-join是错误的但是你坚持认为这是争取的 —— 在这种情况下,可以关闭对fork-join正确性的检查,这有两种方法:
由action node触发的所有计算/处理任务都是异步执行的。大部分由workflow action触发的计算/处理任务,workflow job都要等到所有的任务都运行完毕之后,才能转移至workflow中的下一个节点。
但是fs action除外:这是一个asynchronous action
Oozie可以通过callback或polling两种方式来检测计算/处理任务的完成。
当Oozie启动了一个任务后,Oozie会向该任务提供一个callback URL,一旦运行完成,任务应该触发该URL。
如果任务由于某些原因不能触发这个URL(例如网络故障),或者这个任务本身就无法在完成后触发这个URL,那么Oozie可以查询(poll)这个任务是否已经完成了。
如果任务成功完成,那么workflow会转移至ok;如果没能成功完成,则workflow会转移至error。
如果任务退出时带有错误,则它必须将error-code或者error-message提供给Oozie,这可以帮助decision节点实现错误处理。
一旦Oozie成功启动了一个action,那么即使该action运行失败了,Oozie也不会试图重新启动该action。
如果出现临时性的故障(例如网络故障,或者是远程系统暂时不可用),那么Oozie在一段时间后会重试。
提交Workflow job后,可以通过它的的job-id来查看运行情况,命令为:
oozie job -oozie http://[host]:11000/oozie -info [job-id]
Fs action支持的命令为:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">...<action name="[NODE-NAME]"><fs><delete path='[PATH]'/><mkdir path='[PATH]'/><move source='[FROM-PATH]' target='[TO-PATH]'/><chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false'/><touchz path='[PATH]'/><chgrp path='[PATH]' group='[GROUP]' dir-files='false'/>...</fs><ok to='NODE-NAME'/><error to='NODE-NAME'/></action>...</workflow-app>
Workflow job要等到Spark job运行完毕之后,才会开始下一个action。
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">...<action name="[NODE-NAME]"><spark xmlns="uri:oozie:spark-action:0.1"><job-tracker>[JOB-TRACKER]</job-tracker><name-node>[NAME-NODE]</name-node><prepare><delete path="[PATH]"/>...<mkdir path="[PATH]"/>...</prepare><job-xml>[SPARK SETTINGS FILE]</job-xml><configuration><property><name>[PROPERTY-NAME]</name><value>[PROPERTY-VALUE]</value></property>...</configuration><master>[SPARK MASTER URL]</master><mode>[SPARK MODE]</mode><name>[SPARK JOB NAME]</name><class>[SPARK MAIN CLASS]</class><jar>[SPARK DEPENDENCIES JAR / PYTHON FILE]</jar><spark-opts>[SPARK-OPTIONS]</spark-opts><arg>[ARG-VALUE]</arg>...<arg>[ARG-VALUE]</arg>...</spark><ok to="[NODE-NAME]"/><error to="[NODE-NAME]"/></action>...</workflow-app>
提交一个Spark action时,Oozie会首先启动一个launcher map-reduce job,然后这个launcher job会提交真正的Spark job。Spark action的日志会被重定向到这个launcher map-reduce job的stdout/stderr。
要想将Spark action运行在YARN上,需要:
master指定为yarn-client或者yarn-cluster为了确保Spark-assembly jar对action可见,需要在job.properties文件进行如下设置:
oozie.use.system.libpath=true
oozie.libpath=${NameNode}/user/oozie/share/lib
并将spark-assembly.jar放入到${oozie.libpath}中去
为了确保Spark job显示在Spark History Server中,必须指定以下三个参数:
以上三个参数可以通过以下任意一种方式来设置:
spark-opt中通过--conf指定oozie.service.SparkConfigurationService.spark.configurations指定