分享

Oozie类似于一个工作流的自动化处理工具

问题导读:
1.Oozie是什么?
2.如何定义工作流?
3.如何指定工作流名称?
4.如何kill工作流?
5.工作流路径如何定义?







下面来看下Oozie的运行示意图

1.png


下面是一个Workflow的例子
  1. <workflow-app name='wordcount-wf'
  2. <workflow-app name='wordcount-wf' xmlns="uri:oozie:workflow:0.1">
  3.     <start to='wordcount'/>
  4.     <action name='wordcount'>
  5.         <map-reduce>
  6.             <job-tracker>${jobTracker}</job-tracker>
  7.             <name-node>${nameNode}</name-node>
  8.             <configuration>
  9.                 <property>
  10.                     <name>mapred.mapper.class</name>
  11.                     <value>org.myorg.WordCount.Map</value>
  12.                 </property>
  13.                 <property>
  14.                     <name>mapred.reducer.class</name>
  15.                     <value>org.myorg.WordCount.Reduce</value>
  16.                 </property>
  17.                 <property>
  18.                     <name>mapred.input.dir</name>
  19.                     <value>${inputDir}</value>
  20.                 </property>
  21.                 <property>
  22.                     <name>mapred.output.dir</name>
  23.                     <value>${outputDir}</value>
  24.                 </property>
  25.             </configuration>
  26.         </map-reduce>
  27.         <ok to='end'/>
  28.         <error to='end'/>
  29.     </action>
  30.     <kill name='kill'>
  31.         <message>Something went wrong: ${wf:errorCode('wordcount')}</message>
  32.     </kill/>
  33.     <end name='end'/>
  34. </workflow-app>
复制代码



——这里大家先看看就可以了,后面会给大家详细的讲解

下面给大家讲下如何定义工作流
首先我们要定义一个工作流的启动控制节点
启始节点的入口工作流程的一个路径。
当工作流启动的时候,它会自动的转换为指定的节点。
语法:
  1. <workflow-app name=”[WF-DEF-NAME]” xmlns=”uri:oozie:workflow:0.1”>
  2. ……
  3. <start to=”[NODE-NAME]”>    ---这里to指的是第一个工作流的执行名称
  4. …..
  5. </workflow-app>
复制代码





下面给个实例
  1. <workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
  2.      ...
  3.      <start to="firstHadoopJob"/>
  4.      ...
  5. </ workflow-app >
复制代码



讲完了启动控制节点,那现在也得讲讲最终控制节点了
最终控制节点为工作流程工作时,表示工作流任务完成。
工作流任务完成后最终会成功完成(SUCCEEDED)
语法
  1. <workflow-app name="[WF-DEF-NAME]"   
  2. xmlns="uri:oozie:workflow:0.1">
  3.      ...
  4.      <end name="[NODE-NAME]"/>
  5.      ...
  6. </workflow>
复制代码




name指的是这个工作流的作业名称
下面是个例子
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2. ...
  3. <start name=”[NODE-NAME]”>
  4.      <end name="[NODE-NAME]"/>
  5.      ...
  6. </workflow>
复制代码




当然如果workflow出现错误呢,所以我们在Oozie中也可以对控制节点进行Kill
--杀节点允许工作流任务杀死自己
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <kill name="[NODE-NAME]">
  4.         <message>[MESSAGE-TO-LOG]</message>
  5.     </kill>
  6.     ...
  7. </workflow-app>
复制代码




——<message>中间表示的是kill掉工作流时候所 返回的值
下面是个例子
  1. <workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <kill name="killBecauseNoInput">
  4.         <message>Inpu        t unavailable</message>
  5.     </kill>
  6.     ...
  7. </workflow-app>
复制代码



——<message>中间表示的是kill掉工作流时候所 返回的值

当然有了这些我们还远远不够
下面给大家讲的是
如何给工作流进行选择执行路径可以执行
语法
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <decision name="[NODE-NAME]">
  4.         <switch>
  5.             <case to="[NODE_NAME]">[PREDICATE]</case>
  6.             ...
  7.             <case to="[NODE_NAME]">[PREDICATE]</case>
  8.             <default to="[NODE_NAME]"/>
  9.         </switch>
  10.     </decision>
  11.     ...
  12. </workflow-app>
复制代码



下面是个例子
  1. <workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <decision name="mydecision">
  4.         <switch>
  5.             <case to="reconsolidatejob">
  6.               ${fs:fileSize(secondjobOutputDir) gt 10 * GB}
  7.             </case>
  8.             <case to="rexpandjob">
  9.               ${fs:filSize(secondjobOutputDir) lt 100 * MB}
  10.             </case>
  11.             <case to="recomputejob">
  12.               ${ hadoop:counters('secondjob')[RECORDS][REDUCE_OUT] lt 1000000 }
  13.             </case>
  14.             <default to="end"/>
  15.         </switch>
  16.     </decision>
  17.     ...
  18. </workflow-app>
复制代码



——假如你有学习过java的话应该会根明白这个意思,其实和java的switch语法差不多,这里就不给大家多讲了

下面是一个fork和 join控制节点
可以执行路径为多个并发的执行路径
另外注意fork和join必须是成对使用
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <fork name="[FORK-NODE-NAME]">
  4.         <path start="[NODE-NAME]" />
  5.         ...
  6.         <path start="[NODE-NAME]" />
  7.     </fork>
  8.     ...
  9.     <join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />
  10.     ...
  11. </workflow-app>
复制代码



下面是个实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <fork name="forking">
  4.         <path start="firstparalleljob"/>
  5.         <path start="secondparalleljob"/>
  6.     </fork>
  7.     <action name="firstparallejob">
  8.         <map-reduce>
  9.             <job-tracker>foo:8021</job-tracker>
  10.             <name-node>bar:8020</name-node>
  11.             <job-xml>job1.xml</job-xml>
  12.         </map-reduce>
  13.         <ok to="joining"/>
  14.         <error to="kill"/>
  15.     </action>
  16.     <action name="secondparalleljob">
  17.         <map-reduce>
  18.             <job-tracker>foo:8021</job-tracker>
  19.             <name-node>bar:8020</name-node>
  20.             <job-xml>job2.xml</job-xml>
  21.         </map-reduce>
  22.         <ok to="joining"/>
  23.         <error to="kill"/>
  24.     </action>
  25.     <join name="joining" to="nextaction"/>
  26.     ...
  27. </workflow-app>
复制代码



下面是一些Oozie工作流的动作节点
下面是Oozie中的关于动作节点的一些总的配置
操作计算/处理总是远程
操作是异步的
行动2转换,= OK =和=误差=
恢复行动

下面给是讲解Oozie中是如何给mapreduce进行自动化调度
--注意 在进行hadoop reduce自动话的时候在工作流中一定不能出现mapred.job.tracker和fs.default.name属性和内嵌配置
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <map-reduce>
  5.             <job-tracker>[JOB-TRACKER]</job-tracker>
  6.             <name-node>[NAME-NODE]</name-node>
  7.             <prepare>
  8.                 <delete path="[PATH]"/>
  9.                 ...
  10.                 <mkdir path="[PATH]"/>
  11.                 ...
  12.             </prepare>
  13.             <streaming>
  14.                 <mapper>[MAPPER-PROCESS]</mapper>
  15.                 <reducer>[REDUCER-PROCESS]</reducer>
  16.                 <record-reader>[RECORD-READER-CLASS]</record-reader>
  17.                 <record-reader-mapping>[NAME=VALUE]</record-reader-mapping>
  18.                 ...
  19.                 <env>[NAME=VALUE]</env>
  20.                 ...
  21.             </streaming>
  22.                         <!-- Either streaming or pipes can be specified for an action, not both -->
  23.             <pipes>
  24.                 <map>[MAPPER]</map>
  25.                 <reduce>[REDUCER]</reducer>
  26.                 <inputformat>[INPUTFORMAT]</inputformat>
  27.                 <partitioner>[PARTITIONER]</partitioner>
  28.                 <writer>[OUTPUTFORMAT]</writer>
  29.                 <program>[EXECUTABLE]</program>
  30.             </pipes>
  31.             <job-xml>[JOB-XML-FILE]</job-xml>
  32.             <configuration>
  33.                 <property>
  34.                     <name>[PROPERTY-NAME]</name>
  35.                     <value>[PROPERTY-VALUE]</value>
  36.                 </property>
  37.                 ...
  38.             </configuration>
  39.             <file>[FILE-PATH]</file>
  40.             ...
  41.             <archive>[FILE-PATH]</archive>
  42.             ...
  43.         </map-reduce>        <ok to="[NODE-NAME]"/>
  44.         <error to="[NODE-NAME]"/>
  45.     </action>
  46.     ...
  47. </workflow-app>
复制代码




下面是mapreduce中Oozie对HDFS文件的一些文件的操作
  1. <workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="myfirstHadoopJob">
  4.         <map-reduce>
  5.             <job-tracker>foo:8021</job-tracker>
  6.             <name-node>bar:8020</name-node>
  7.             <prepare>
  8.                 <delete path="hdfs://foo:8020/usr/tucu/output-data"/>
  9.             </prepare>
  10.             <job-xml>/myfirstjob.xml</job-xml>
  11.             <configuration>
  12.                 <property>
  13.                     <name>mapred.input.dir</name>
  14.                     <value>/usr/tucu/input-data</value>
  15.                 </property>
  16.                 <property>
  17.                     <name>mapred.output.dir</name>
  18.                     <value>/usr/tucu/input-data</value>
  19.                 </property>
  20.                 <property>
  21.                     <name>mapred.reduce.tasks</name>
  22.                     <value>${firstJobReducers}</value>
  23.                 </property>
  24.                 <property>
  25.                     <name>oozie.action.external.stats.write</name>
  26.                     <value>true</value>
  27.                 </property>
  28.             </configuration>
  29.         </map-reduce>
  30.         <ok to="myNextAction"/>
  31.         <error to="errorCleanup"/>
  32.     </action>
  33.     ...
  34. </workflow-app>
复制代码




下面是个流实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="firstjob">
  4.         <map-reduce>
  5.             <job-tracker>foo:8021</job-tracker>
  6.             <name-node>bar:8020</name-node>
  7.             <prepare>
  8.                 <delete path="${output}"/>
  9.             </prepare>
  10.             <streaming>
  11.                 <mapper>/bin/bash testarchive/bin/mapper.sh testfile</mapper>
  12.                 <reducer>/bin/bash testarchive/bin/reducer.sh</reducer>
  13.             </streaming>
  14.             <configuration>
  15.                 <property>
  16.                     <name>mapred.input.dir</name>
  17.                     <value>${input}</value>
  18.                 </property>
  19.                 <property>
  20.                     <name>mapred.output.dir</name>
  21.                     <value>${output}</value>
  22.                 </property>
  23.                 <property>
  24.                     <name>stream.num.map.output.key.fields</name>
  25.                     <value>3</value>
  26.                 </property>
  27.             </configuration>
  28.             <file>/users/blabla/testfile.sh#testfile</file>
  29.             <archive>/users/blabla/testarchive.jar#testarchive</archive>
  30.         </map-reduce>
  31.         <ok to="end"/>
  32.         <error to="kill"/>
  33.     </action>
  34.   ...
  35. </workflow-app>
复制代码




下面是个管道实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="firstjob">
  4.         <map-reduce>
  5.             <job-tracker>foo:8021</job-tracker>
  6.             <name-node>bar:8020</name-node>
  7.             <prepare>
  8.                 <delete path="${output}"/>
  9.             </prepare>
  10.             <pipes>
  11.                 <program>bin/wordcount-simple#wordcount-simple</program>
  12.             </pipes>
  13.             <configuration>
  14.                 <property>
  15.                     <name>mapred.input.dir</name>
  16.                     <value>${input}</value>
  17.                 </property>
  18.                 <property>
  19.                     <name>mapred.output.dir</name>
  20.                     <value>${output}</value>
  21.                 </property>
  22.             </configuration>
  23.             <archive>/users/blabla/testarchive.jar#testarchive</archive>
  24.         </map-reduce>
  25.         <ok to="end"/>
  26.         <error to="kill"/>
  27.     </action>
  28.   ...
  29. </workflow-app>
复制代码


通过前面的一些例子我想大家也对Oozie有一定的了解了,下面讲的是Oozie如何调用pig
注意我们在使用Oozie进行pig自动话一定不能使用Hadoop的mapred.job.tracker和fs.default.name属性一定不能出现在工作xml和内嵌的配置
语法:  
Oozie 框架在0.2 pig上进行行动
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.2">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <pig>
  5.             <job-tracker>[JOB-TRACKER]</job-tracker>
  6.             <name-node>[NAME-NODE]</name-node>
  7.             <prepare>
  8.                <delete path="[PATH]"/>
  9.                ...
  10.                <mkdir path="[PATH]"/>
  11.                ...
  12.             </prepare>
  13.             <job-xml>[JOB-XML-FILE]</job-xml>
  14.             <configuration>
  15.                 <property>
  16.                     <name>[PROPERTY-NAME]</name>
  17.                     <value>[PROPERTY-VALUE]</value>
  18.                 </property>
  19.                 ...
  20.             </configuration>
  21.             <script>[PIG-SCRIPT]</script>
  22.             <param>[PARAM-VALUE]</param>
  23.                 ...
  24.             <param>[PARAM-VALUE]</param>
  25.             <argument>[ARGUMENT-VALUE]</argument>
  26.                 ...
  27.             <argument>[ARGUMENT-VALUE]</argument>
  28.             <file>[FILE-PATH]</file>
  29.             ...
  30.             <archive>[FILE-PATH]</archive>
  31.             ...
  32.         </pig>
  33.         <ok to="[NODE-NAME]"/>
  34.         <error to="[NODE-NAME]"/>
  35.     </action>
  36.     ...
  37. </workflow-app>
复制代码



Oozie 框架在0.1 pig上进行行动
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <pig>
  5.             <job-tracker>[JOB-TRACKER]</job-tracker>
  6.             <name-node>[NAME-NODE]</name-node>
  7.             <prepare>
  8.                <delete path="[PATH]"/>
  9.                ...
  10.                <mkdir path="[PATH]"/>
  11.                ...
  12.             </prepare>
  13.             <job-xml>[JOB-XML-FILE]</job-xml>
  14.             <configuration>
  15.                 <property>
  16.                     <name>[PROPERTY-NAME]</name>
  17.                     <value>[PROPERTY-VALUE]</value>
  18.                 </property>
  19.                 ...
  20.             </configuration>
  21.             <script>[PIG-SCRIPT]</script>
  22.             <param>[PARAM-VALUE]</param>
  23.                 ...
  24.             <param>[PARAM-VALUE]</param>
  25.             <file>[FILE-PATH]</file>
  26.             ...
  27.             <archive>[FILE-PATH]</archive>
  28.             ...
  29.         </pig>
  30.         <ok to="[NODE-NAME]"/>
  31.         <error to="[NODE-NAME]"/>
  32.     </action>
  33.     ...
  34. </workflow-app>
复制代码


当然我们后面还要使用Oozie别的方式去实现pig
比如
Oozie 0.2模式
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.2">
  2.     ...
  3.     <action name="myfirstpigjob">
  4.         <pig>
  5.             <job-tracker>foo:8021</job-tracker>
  6.             <name-node>bar:8020</name-node>
  7.             <prepare>
  8.                 <delete path="${jobOutput}"/>
  9.             </prepare>
  10.             <configuration>
  11.                 <property>
  12.                     <name>mapred.compress.map.output</name>
  13.                     <value>true</value>
  14.                 </property>
  15.                 <property>
  16.                     <name>oozie.action.external.stats.write</name>
  17.                     <value>true</value>
  18.                 </property>
  19.             </configuration>
  20.             <script>/mypigscript.pig</script>
  21.             <argument>-param</argument>
  22.             <argument>INPUT=${inputDir}</argument>
  23.             <argument>-param</argument>
  24.             <argument>OUTPUT=${outputDir}/pig-output3</argument>
  25.         </pig>
  26.         <ok to="myotherjob"/>
  27.         <error to="errorcleanup"/>
  28.     </action>
  29.     ...
  30. </workflow-app>
复制代码




Oozie 0.1模式
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="myfirstpigjob">
  4.         <pig>
  5.             <job-tracker>foo:8021</job-tracker>
  6.             <name-node>bar:8020</name-node>
  7.             <prepare>
  8.                 <delete path="${jobOutput}"/>
  9.             </prepare>
  10.             <configuration>
  11.                 <property>
  12.                     <name>mapred.compress.map.output</name>
  13.                     <value>true</value>
  14.                 </property>
  15.             </configuration>
  16.             <script>/mypigscript.pig</script>
  17.             <param>InputDir=/home/tucu/input-data</param>
  18.             <param>OutputDir=${jobOutput}</param>
  19.         </pig>
  20.         <ok to="myotherjob"/>
  21.         <error to="errorcleanup"/>
  22.     </action>
  23.     ...
  24. </workflow-app>
复制代码




下面是Oozie使用的Fs进行自动话调度
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <fs>
  5.             <delete path='[PATH]'/>
  6.             ...
  7.             <mkdir path='[PATH]'/>
  8.             ...
  9.             <move source='[SOURCE-PATH]' target='[TARGET-PATH]'/>
  10.             ...
  11.             <chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
  12.             ...
  13.             <touchz path='[PATH]' />
  14.             ...
  15.             <chgrp path='[PATH]' group='[GROUP]' dir-files='false' />
  16.         </fs>
  17.         <ok to="[NODE-NAME]"/>
  18.         <error to="[NODE-NAME]"/>
  19.     </action>
  20.     ...
  21. </workflow-app>
复制代码



下面是个实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.5">
  2.     ...
  3.     <action name="hdfscommands">
  4.          <fs>
  5.             <delete path='hdfs://foo:8020/usr/tucu/temp-data'/>
  6.             <mkdir path='archives/${wf:id()}'/>
  7.             <move source='${jobInput}' target='archives/${wf:id()}/processed-input'/>
  8.             <chmod path='${jobOutput}' permissions='-rwxrw-rw-' dir-files='true'><recursive/></chmod>
  9.             <chgrp path='${jobOutput}' group='testgroup' dir-files='true'><recursive/></chgrp>
  10.         </fs>
  11.         <ok to="myotherjob"/>
  12.         <error to="errorcleanup"/>
  13.     </action>
  14.     ...
  15. </workflow-app>
复制代码




下面这个是0.4的框架对Oozie进行调度
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.4">
  2.     ...
  3.     <action name="hdfscommands">
  4.         <fs>
  5.            <name-node>hdfs://foo:8020</name-node>
  6.            <job-xml>fs-info.xml</job-xml>
  7.            <configuration>
  8.              <property>
  9.                <name>some.property</name>
  10.                <value>some.value</value>
  11.              </property>
  12.            </configuration>
  13.            <delete path='/usr/tucu/temp-data'/>
  14.         </fs>
  15.         <ok to="myotherjob"/>
  16.         <error to="errorcleanup"/>
  17.     </action>
  18.     ...
  19. </workflow-app>
复制代码



下面是Oozie对ssh远程的基本操作
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <ssh>
  5.             <host>[USER]@[HOST]</host>
  6.             <command>[SHELL]</command>
  7.             <args>[ARGUMENTS]</args>
  8.             ...
  9.             <capture-output/>
  10.         </ssh>
  11.         <ok to="[NODE-NAME]"/>
  12.         <error to="[NODE-NAME]"/>
  13.     </action>
  14.     ...
  15. </workflow-app>
复制代码



下面是个实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="myssjob">
  4.         <ssh>
  5.             <host>foo@bar.com<host>
  6.             <command>uploaddata</command>
  7.             <args>jdbc:derby://bar.com:1527/myDB</args>
  8.             <args>hdfs://foobar.com:8020/usr/tucu/myData</args>
  9.         </ssh>
  10.         <ok to="myotherjob"/>
  11.         <error to="errorcleanup"/>
  12.     </action>
  13.     ...
  14. </workflow-app>
复制代码




下面讲的是一个子流程
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="[NODE-NAME]">
  4.         <sub-workflow>
  5.             <app-path>[WF-APPLICATION-PATH]</app-path>
  6.             <propagate-configuration/>
  7.             <configuration>
  8.                 <property>
  9.                     <name>[PROPERTY-NAME]</name>
  10.                     <value>[PROPERTY-VALUE]</value>
  11.                 </property>
  12.                 ...
  13.             </configuration>
  14.         </sub-workflow>
  15.         <ok to="[NODE-NAME]"/>
  16.         <error to="[NODE-NAME]"/>
  17.     </action>
  18.     ...
  19. </workflow-app
复制代码



下面是个实例
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
  2.     ...
  3.     <action name="a">
  4.         <sub-workflow>
  5.             <app-path>child-wf</app-path>
  6.             <configuration>
  7.                 <property>
  8.                     <name>input.dir</name>
  9.                     <value>${wf:id()}/second-mr-output</value>
  10.                 </property>
  11.             </configuration>
  12.         </sub-workflow>
  13.         <ok to="end"/>
  14.         <error to="kill"/>
  15.     </action>
  16.     ...
  17. </workflow-app>
复制代码









已有(1)人评论

跳转到指定楼层
long1657 发表于 2015-3-9 14:10:33
请问一下oozie编译的时候会出现很多问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条