workflow 2012-05-16
控制节点包括start、end、kill、decision、fork、join。其中start、end、kill代表了工作流的起始及工作流执行逻辑(路径),如decision、fork、join
节点名称必需复合[a-zA-Z][\-_a-zA-Z0-0]*,最大20个字符;
start控制节点
此节点是工作流任务的入口点,工作流定义必须有一个start节点
语法:
<workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
...
<startto="[NODE-NAME]"/>
...
</workflow-app>
例:
<workflow-appname="foo-wf"xmlns="uri:oozie:workflow:0.1">
...
<startto="firstHadoopJob"/>
...
</workflow-app>
end节点
此节点是工作流执行成功的节点。当工作流有多个任务执行,其中有一个到达end节点,其它任务会被kill掉,但结果是成功的。工作流定义必须有一个end节点
语法:
<workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
...
<endname="[NODE-NAME]"/>
...
</workflow-app>
例:
<workflow-appname="foo-wf"xmlns="uri:oozie:workflow:0.1">
...
<endname="end"/>
</workflow-app>
kill节点
此节点,允许工作流任务kill自己,当工作流遇到错误,会执行kill节点。如果有多个工作流任务,其中有一个先到达了kill节点,其它任务也会被kill掉,整个任务是失败的。工作流定义可以有零个或多个kill节点
语法:
<workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
...
<killname="[NODE-NAME]">
<message>[MESSAGE-TO-LOG]</message>
</kill>
...
</workflow-app>
message元素的内容会记录工作流任务被kill的原因
例:
<workflow-appname="foo-wf"xmlns="uri:oozie:workflow:0.1">
...
<killname="killBecauseNoInput">
<message>Inputunavailable</message>
</kill>
...
</workflow-app>
decision节点
此节点允许根据条件选择不同的执行路径,比较像swith-case表达式,通过断言来决定执行哪个路径,switch-case建议有一个default,以免出现错误。断言是JSPExpressionLanguage(EL)表达式
语法:
<workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
...
<decisionname="[NODE-NAME]">
<switch>
<caseto="[NODE_NAME]">[PREDICATE]</case>
...
<caseto="[NODE_NAME]">[PREDICATE]</case>
<defaultto="[NODE_NAME]"/>
</switch>
</decision>
...
</workflow-app>
例:
<workflow-appname="foo-wf"xmlns="uri:oozie:workflow:0.1">
...
<decisionname="mydecision">
<switch>
<caseto="reconsolidatejob">
${fs:fileSize(secondjobOutputDir)gt10*GB}
</case>
<caseto="rexpandjob">
${fs:filSize(secondjobOutputDir)lt100*MB}
</case>
<caseto="recomputejob">
${hadoop:counters('secondjob')[RECORDS][REDUCE_OUT]lt1000000}
</case>
<defaultto="end"/>
</switch>
</decision>
...
</workflow-app>
fork&join节点
fork节点把一个执行路径分发成多个并发执行路径
join节点一直等待,直到所有的fork节点执行路径到达join节点
fork&join节点必须成对出现
语法:
<workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
...
<forkname="[FORK-NODE-NAME]">
<pathstart="[NODE-NAME]"/>
...
<pathstart="[NODE-NAME]"/>
</fork>
...NAME
<joinname="[JOIN-NODE-NAME]"to="[NODE-NAME]"/>
...
</workflow-app>
例:
<workflow-appname="sample-wf"xmlns="uri:oozie:workflow:0.1">
...
<forkname="forking">
<pathstart="firstparalleljob"/>
<pathstart="secondparalleljob"/>
</fork>
<actionname="firstparallejob">
<map-reduce>
<job-tracker>foo:9001</job-tracker>
<name-node>bar:9000</name-node>
<job-xml>job1.xml</job-xml>
</map-reduce>
<okto="joining"/>
<errorto="kill"/>
</action>
<actionname="secondparalleljob">
<map-reduce>
<job-tracker>foo:9001</job-tracker>
<name-node>bar:9000</name-node>
<job-xml>job2.xml</job-xml>
</map-reduce>
<okto="joining"/>
<errorto="kill"/>
</action>
<joinname="joining"to="nextaction"/>
...
</workflow-app>