@xtccc
2016-01-20T13:32:41.000000Z
字数 5411
阅读 4258
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
指定