Oozie自学(二)-运行job、function、workflow、coordinnate

来源:互联网 发布:qemu-ga windows 1053 编辑:程序博客网 时间:2024/06/07 01:37

使用自带的 oozie-examples.tar.gz运行oozie.

解压 oozie-examples.tar.gz 到本地系统中,
将examples目录文件拷贝到hdfs系统中
  1. $ hadoop hdfs  -put examples examples 
注意:如果examples已经存在hdfs系统,必须将之前的进行删除,否则会拷贝失败。

1. 添加bin/ 到环境变量中
2.解压oozie-sharelib的tar包,将其拷贝到hdfs系统中的Oozie的根目录下。
  1. $ hadoop hdfs -put share share
3.系统设置的案例JobTracker(ResourcManager) 是localhost:8021和NameNode为hdfs://localhost:8020。实际的值不同时,我们需要在examples的目录中配置正确的值。job.properties
每个案例都一个文件夹,都会有程序的配置文件Xml,和job.properties文件提交任务的和JAR文件所需要的。
每个系统案例都会默认输出到examples/output-data/${EXAMPLE_NAME} directory。
job.properties必须是一个本地文件,不能在HDFS系统中。

启动一个job
  1. $ bin/oozie job -oozie http://hadoop.com:11000/oozie -config examples/apps/map-reduce/job.properties -run
job任务编号
  1. job: 0000001-170331194520545-oozie-huan-W
查看job信息
  1. $ oozie job -oozie http://hadoop.com:11000/oozie -info 0000001-170331194520545-oozie-huan-W

  1. WorkflowName: map-reduce-wf
  2. AppPath      : hdfs://hadoop.com:8020/user/huangxgc/examples/apps/map-reduce/workflow.xml
  3. Status        : RUNNING
  4. Run           :0
  5. User          : huangxgc
  6. Group         :-
  7. Created       :2017-03-3113:02 GMT
  8. Started       :2017-03-3113:02 GMT
  9. LastModified:2017-03-3113:26 GMT
  10. Ended         :-
  11. CoordAction ID:-
web网页查看运行状态::
http://hadoop.com:11000

marperduce的ResourceManager
http://hadoop.com:8088
为了避免在每次输入 -oozie命令时输入http:localhost:11000/Oozie,我们可以配置OOZIE_URL环境变量
  1. $ export OOZIE_URL="http:// :11000/oozie"

本地Oozie示例,Oozie提供了Java的API。
示例:
  1. import org.apache.oozie.local.LocalOozie;
  2. import org.apache.oozie.client.OozieClient;
  3. import org.apache.oozie.client.WorkflowJob;
  4. import java.util.Properties;
  5. ...
  6. //启动本地Oozie
  7. LocalOozie.start();
  8. //获得一个OozieCLient对象
  9. OozieClient wc =LocalOozie.getClient();
  10. //创建工作流作业配置并设置工作流应用程序路径
  11. Properties conf = wc.createConfiguration();
  12. conf.setPropertyOozieClient.APP_PATH,"hdfs://hadoop.com:8020/user/huangxg/my-wf-app”);
  13. //设置工作流参数
  14. conf.setProperty("ResourceManager","hadoop.com:8032");
  15. conf.setProperty"inputDir","/user/huangxgc/indir");
  16. conf.setProperty"outputDir","/user/huangxgc/outdir");
  17. ...
  18. //提交并启动工作流作业
  19. String jobId = wc.runconf);
  20. System.out.println("Workflow job submitted");
  21. //等待工作流作业每10秒钟完成打印状态
  22. whilewc.getJobInfojobId).getStatus()==Workflow.Status.RUNNING){
  23. System.out.println"Workflow job running ...");
  24. Thread.sleep10 *1000);
  25. }
  26. //打印工作流作业的最终状态
  27. System.out.println(“工作流作业完成...”);
  28. System.out.printlnwf.getJobInfojobId));
  29. // stop local Oozie
  30. LocalOozie.stop();
  31. ...

Oozie的功能规范:

Oozie除了自身动作节点以外还支持9种动作扩展:
  1. // 4.0.0版本的Oozie
  2. EmailAction
  3. ShellAction
  4. HiveAction
  5. SqoopAction
  6. SshAction
  7. DistCpAction
  8. Writing a CustomActionExecutor
  9. //4.3.0支持Spark 动作
  10. Hive 2 Action
  11. Spark Action

Oozie Specification, a Hadoop Workflow System

  • oozie的规范,hadoop的工作流系统

Action: An execution/computation task (Map-Reduce job, Pig job, a shell command). It can also be referred as task or 'action node'.
Workflow: A collection of actions arranged in a control dependency DAG (Direct Acyclic Graph). "control dependency" from one action to another means that the second action can't run until the first action has completed.
Workflow Definition: A programmatic description of a workflow that can be executed.
Workflow Definition Language: The language used to define a Workflow Definition.
Workflow Job: An executable instance of a workflow definition.
Workflow Engine: A system that executes workflows jobs. It can also be referred as a DAG engine
Workflow Action Nodes
  • 3.2.1 Action Basis
    • 3.2.1.1 Action Computation/Processing Is Always Remote
    • 3.2.1.2 Actions Are Asynchronous
    • 3.2.1.3 Actions Have 2 Transitions, =ok= and =error=
    • 3.2.1.4 Action Recovery
  • 3.2.2 Map-Reduce Action
    • 3.2.2.1 Adding Files and Archives for the Job
    • 3.2.2.2 Configuring the MapReduce action with Java code
    • 3.2.2.3 Streaming
    • 3.2.2.4 Pipes
    • 3.2.2.5 Syntax
  • 3.2.3 Pig Action
  • 3.2.4 Fs (HDFS) action
  • 3.2.5 Ssh Action
  • 3.2.6 Sub-workflow Action
3.2.7 Java Action

  • 工作流的定义the workflow definition     
       A workflow definition is a DAG with control flow nodes (start, end, decision, fork, join, kill) or action nodes (map-reduce, pig, etc.), nodes are connected by transitions arrows.(转换箭头连接)
       The workflow definition language is XML based and it is called hPDL (Hadoop Process Definition Language).(hadoop过程定义语言)
       Refer to(参阅) the Appendix A(附录A) for theOozie Workflow Definition XML Schema . Appendix B has Workflow Definition Examples .

Oozie不支持工作流定义中的循环,工作流定义必须是严格的DAG。
  • 工作流节点
    • 工作流节点分为控制流节点和动作节点:
      • 控制流节点: 控制工作流和工作流作业执行路径的开始和结束的节点。
      • 动作节点: 触发执行计算/处理任务的节点。

节点名称和转换必须符合以下模式= [a-zA-Z] [\ -_ a-zA-Z0-9] * =,最多20个字符。

  • Contral Flow Nodes(控制流节点) 6个Node
    • 开始和结束节点——开始、结束和终止;
    • 执行路径节点——决策、分支和连接
      Control flow nodes define the beginning and the end of a workflow (the start , end and kill nodes) and provide a mechanism to control the workflow execution path (the decision , fork and join nodes).
= Start Control  Node 
  •  一个工作流任务的入口,一个工作流必须一个start node。
语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.5">
  2. ...
  3. <startto="[NODE-NAME]"/>
  4. ...
  5. </workflow-app>
= End Control Node
  • 结束节点是表明任务成功完成,当任务到达end,任务就成功完成。
语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.5">
  2. ...
  3. <endname="[NODE-NAME]"/>
  4. ...
  5. </workflow-app>
Kill Control Node
终止节点允许工作流任务终止自己,到达kill的任务表明,最后完成err.
语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.5">
  2. ...
  3. <killname="[NODE-NAME]">
  4. <message>[MESSAGE-TO-LOG]</message>
  5. </kill>
  6. ...
  7. </workflow-app>
message描述任务终止的原因
kill node 没有过渡元素,因为kill执行完,任务已经被终止了。
Decision Control Node
  • decision能都够在工作路径上执行选择,可以看做是switch-case语句,在执行列中遇到true时开始执行,当没有遇到true时,执行默认路径。
  • Predicates解析EL表达式,将其解析为bool类型,如:     
  1. ${fs:fileSize('/usr/foo/myinputdir') gt 10* GB}
语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.5">
  2. ...
  3. <decisionname="[NODE-NAME]">
  4. <switch>
  5. <caseto="[NODE_NAME]">[PREDICATE]</case>
  6. ...
  7. <caseto="[NODE_NAME]">[PREDICATE]</case>
  8. <defaultto="[NODE_NAME]"/>
  9. </switch>
  10. </decision>
  11. ...
  12. </workflow-app>
所有的decision节点,必须包含default to ,(默认节点),防止没有返回true时,进入kill node
Fork and Join Control Nodes
fork 分支,将一个节点分成多分
Join 连接     将多个节点连接成一个node
语法:
  1. <workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
  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>
fork中的元素节点的为,将要并发执行的节点名称
join的名称为fork执行完后跳跃的目标
示例:
  1. <workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.5">
  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>
Workflow Action Nodes 工作流的动作节点
  • 动作节点是工作流触发执行计算/处理任务的机制。
  • 3.2.1 Action Basis
    • 3.2.1.1 Action Computation/Processing Is Always Remote
    • 3.2.1.2 Actions Are Asynchronous
    • 3.2.1.3 Actions Have 2 Transitions, =ok= and =error=
    • 3.2.1.4 Action Recovery
  • 3.2.2 Map-Reduce Action
    • 3.2.2.1 Adding Files and Archives for the Job
    • 3.2.2.2 Configuring the MapReduce action with Java code
    • 3.2.2.3 Streaming
    • 3.2.2.4 Pipes
    • 3.2.2.5 Syntax
  • 3.2.3 Pig Action
  • 3.2.4 Fs (HDFS) action
  • 3.2.5 Ssh Action
  • 3.2.6 Sub-workflow Action
  • 3.2.7 Java Action
    • 3.2.7.1 Overriding an action's Main class
 http://oozie.apache.org/docs/4.3.0/WorkflowFunctionalSpec.html#a3.1.5_Fork_and_Join_Control_Nodes
Oozie的action中,执行完之后,才能再次进行下一个工作流节点。

  • Map-Reduce Action
A map-reduce action can be configured to perform file system cleanup and directory creation before starting the map reduce job. This capability enables Oozie to retry a Hadoop job in the situation of a transient failure (Hadoop checks the non-existence of the job output directory and then creates it when the Hadoop job is starting, thus a retry without cleanup of the job output directory would fail).

The workflow job will wait until the Hadoop map/reduce job completes before continuing to the next action in the workflow execution path.

The counters of the Hadoop job and job exit status (=FAILED=, KILLED or SUCCEEDED ) must be available to the workflow job after the Hadoop jobs ends. This information can be used from within decision nodes and other actions configurations.

The map-reduce action has to be configured with all the necessary Hadoop JobConf properties to run the Hadoop map/reduce job.


示例:MapReduce中的WordCount工作流。实际应用不能输入注释
  1. <workflow-app xmlns="uri:oozie:workflow:0.5" name="myoozie-wordcount-wf">
  2. <start to=mr-node-wordcount"/>
  3. <action name="mr-node-wordcount">
  4. <map-reduce>
  5. <job-tracker>${jobTracker}</job-tracker>
  6. <name-node>${nameNode}</name-node>
  7. <!--注意,实际的workflow中不能使用注释-->
  8. <!--删除mapreduce的输出目录-->
  9. <prepare>
  10. <!--可以在job.properties中对目录环变量进行重新配置-->
  11. <delete path="${nameNode}/${wf:user()}/${examplesRoot}/output-data/${outputDir}"/>
  12. </prepare>
  13. <!--使用的配置文件-->
  14. <configuration>
  15. <!--启用新的APIOozie默认使用旧的API-->
  16. <property>
  17. <name>mapred.mapper.new-api</name>
  18. <value>true</value>
  19. </property>
  20. <property>
  21. <name>mapred.reducer.new-api</name>
  22. <value>true</value>
  23. </property>
  24. <property>
  25. <name>mapreduce.job.queuename</name>
  26. <value>${queueName}</value>
  27. </property>
  28. <property>
  29. <name>mapreduce.job.map.class</name>
  30. <value>org.apache.oozie.example.SampleMapper</value>
  31. </property>
  32. <property>
  33. <name>mapreduce.job.reduce.class</name>
  34. <value>org.apache.oozie.example.SampleReducer</value>
  35. </property>
  36. <!--输入输出路径-->
  37. <property>
  38. <name>mapred.input.dir</name>
  39. <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
  40. </property>
  41. <property>
  42. <name>mapred.output.dir</name>
  43. <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}</value>
  44. </property>
  45. <!--mapjob output新设置。key-value 属性,根据实际需求进行改变-->
  46. <!--根据需求另需要设置shuffle-->
  47. <property>
  48. <name>mapreduce.job.output.key.class</name>
  49. <value>org.apache.hadoop.io.Text</value>
  50. </property>
  51. <property>
  52. <name>mapreduce.job.output.value.class</name>
  53. <value>org.apache.hadoop.io.IntWritable</value>
  54. </property>
  55. <property>
  56. <name>mapreduce.map.output.key.class</name>
  57. <value>org.apache.hadoop.io.Text</value>
  58. </property>
  59. <property>
  60. <name>mapreduce.map.output.value.class</name>
  61. <value>org.apache.hadoop.io.IntWritable</value>
  62. </property>
  63. </configuration>
  64. </map-reduce>
  65. <ok to="end"/>
  66. <error to="fail"/>
  67. </action>
  68. <kill name="fail">
  69. <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
  70. </kill>
  71. <end name="end"/>
  72. </workflow-app>
  • Hive Action
语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
  2. ...
  3. <actionname="[NODE-NAME]">
  4. <hivexmlns="uri:oozie:hive-action:0.2">
  5. <job-tracker>[JOB-TRACKER]</job-tracker>
  6. <name-node>[NAME-NODE]</name-node>
  7. <prepare>
  8. <deletepath="[PATH]"/>
  9. ...
  10. <mkdirpath="[PATH]"/>
  11. ...
  12. </prepare>
  13.            <!--hive-site.xml文件的配置地址-->
  14. <job-xml>[HIVE SETTINGS FILE]</job-xml>
  15. <configuration>
  16.                <!--hadoop的配置属性-->
  17. <property>
  18. <name>[PROPERTY-NAME]</name>
  19. <value>[PROPERTY-VALUE]</value>
  20. </property>
  21. ...
  22. </configuration>
  23.            <!--脚本的HDFS地址-->
  24. <script>[HIVE-SCRIPT]</script>
  25.            <!--脚本使用的参数-->
  26. <param>[PARAM-VALUE]</param>
  27. ...
  28. <param>[PARAM-VALUE]</param>
  29. <file>[FILE-PATH]</file>
  30. ...
  31. <archive>[FILE-PATH]</archive>
  32. ...
  33. </hive>
  34. <okto="[NODE-NAME]"/>
  35. <errorto="[NODE-NAME]"/>
  36. </action>
  37. ...
  38. </workflow-app>
    Hive的启动作业前,可以配置蜂巢动作来创建或删除HDFS目录。
    Hive的配置可以使用configuration标签中的job-xml子元素和内联标签,来指定文件。Oozie内联配置,可以使用EL表达式,configuration标签中指定的属性值会覆盖job-xml文件中指定的值。
Oozie Hive操作支持具有参数变量的Hive脚本,其语法为pargram标签中的$ {VARIABLES} 。
    Hive的使用过程中需要将所连接数据库的jar包拷贝到Oozie的wf-app根目录下的创建的lib包中。
  • 注意:
    • Hadoop mapred.job.tracker and fs.default.name 不能出现在内联标签中。
    • Hive使用的hadoop的API 默认为老的API在默认使用的时候,需要注意使用,务必需要确认xml文件中是否需要更改,mapred.mapper.new-api默认为FALSE。
    • 可通过运行Hive通过ResourceManager8088中Historyserver进行查看
示例:在Hive中运行script进行插入和运行操作,EL表达式的参数在job.properties中进行配置。
  1. <workflow-appname="sample-wf"xmlns="uri:oozie:workflow:0.5">
  2. ...
  3. <actionname="myfirsthivejob">
  4. <hivexmlns="uri:oozie:hive-action:0.5">
  5. <job-tracker>${jobTracker}</job-tracker>
  6. <name-node>${nameNode}</name-node>
  7. <prepare>
  8. <deletepath="${nameNode}/${wf:user()}/${examplesRoot}/${outputDir}"/>
  9. </prepare>
  10.            <job-XMl>${{nameNode}${nameNode}/${wf:user()}/${examplesRoot}/job-xml.xml/${}
  11. <configuration>
  12. <property>
  13. <name>mapred.compress.map.output</name>
  14. <value>true</value>
  15. </property>
  16. </configuration>
  17. <script>myscript.q</script>
  18. <param>${nameNode}/${wf:user()}/${examplesRoot}/${inputDir}</param>
  19. <param>${nameNode}/${wf:user()}/${examplesRoot}/${outputDir}</param>
  20. </hive>
  21. <okto="myotherjob"/>
  22. <errorto="errorcleanup"/>
  23. </action>
  24. ...
  25. </workflow-app>
   Hive(从Hive 0.8开始)会忽略hive-default.xml 文件。因此,Oozie(作为Oozie 3.4)忽略了 Oozie for Hive的操作,如果是以前版本需要Oozie.hive.defaults属性。
  Hive action的日志记录级别:通过在configuration中的oozie.hive.log.level进行配置。

  • Sqoop Action

语法:
  1. <workflow-appname="[WF-DEF-NAME]"xmlns="uri:oozie:workflow:0.1">
  2. ...
  3. <actionname="[NODE-NAME]">
  4. <sqoopxmlns="uri:oozie:sqoop-action:0.2">
  5. <job-tracker>[JOB-TRACKER]</job-tracker>
  6. <name-node>[NAME-NODE]</name-node>
  7. <prepare>
  8. <deletepath="[PATH]"/>
  9. ...
  10. <mkdirpath="[PATH]"/>
  11. ...
  12. </prepare>
  13. <configuration>
  14. <property>
  15. <name>[PROPERTY-NAME]</name>
  16. <value>[PROPERTY-VALUE]</value>
  17. </property>
  18. ...
  19. </configuration>
  20. <command>[SQOOP-COMMAND]</command>
  21. <arg>[SQOOP-ARGUMENT]</arg>
  22. ...
  23. <file>[FILE-PATH]</file>
  24. ...
  25. <archive>[FILE-PATH]</archive>
  26. ...
  27. </sqoop>
  28. <okto="[NODE-NAME]"/>
  29. <errorto="[NODE-NAME]"/>
  30. </action>
  31. ...
  32. </workflow-app>
sqoop通过arg标签进行配置
  1. <arg>import</arg>
  2. <arg>--connect</arg>
  3. <arg>jdbc:hsqldb:file:db.hsqldb</arg>
  4. <arg>--table</arg>
  5. <arg>TT</arg>
  6. <arg>--target-dir</arg>
  7. <arg>hdfs://localhost:8020/user/tucu/foo</arg>
  8. <arg>-m</arg>
  9. <arg>1</arg>

sqoop的使用和Hive类似.在schema0.3中,在file指定的文件包括job-xml,可以允许指定多个job-xml文件。

Sqoop command

  • sqoop的命令可以沟通过command的标签或者多个arg标签进行指定该操作。
  • 也可以通过 bin/sqoo --option-file xxx.txt 来执行
** sqoop的引号使用双引号,不使用单引号且仅识别单字符。

  • Shell Action






Oozie Coordinate(调度)
时间的和数据的可用性
** 时间的调度
基于unix中crontab进行调度,包括startTime(ST)、Frequency(F)、End time(ET)
  • 确保时区的一致性。
**在使用OOzie进行时间调度处理前,需要确认时间的一致性
   OOzie默认使用UTC,需更在Oozie-site.xml中改为北京时区GMT+0800,UTC通用协调时与GMT格林尼治平均时一样。
  • 对oozie.processing.timezone属性修改为GMT+0800,使用设置后,时间的格式将变为时间后必须加+0800
  • Oozie的web控制台也需要设置的Timezone的时区保持一致,否则在控制台的时间将会出现不一致,目录地址:${OOZIE_HOME}oozie-server/webapps/oozie/oozie-cosole.jsfunciton getTimeZone中进行修改。   

Coordinate
date -R查看命令查看时区
   CST或者+800表示我过的东八区
  1. Sun, 02 Apr 2017 19:23:39 +0800

  • 频率和时间段的表达式(Frequency and Time-Period Representation)
    • coordinate支持两种时间表达式,分别是EL表达式和Crontab表达式

EL表达式:

EL Constant

Value

Example

${coord:minutes(int n)}

n

${coord:minutes(45)} --> 45

${coord:hours(int n)}

n * 60

${coord:hours(3)} --> 180

${coord:days(int n)}

variable

${coord:days(2)} --> minutes in 2 full days from the current date

${coord:months(int n)}

variable

${coord:months(1)} --> minutes in a 1 full month from the current date

${cron syntax}

variable

${0,10 15 * * 2-6} --> a job that runs every weekday at 3:00pm and 3:10pm UTC time

分时天月星期
Cron ExpressionMeaning10 9 * * *Runs everyday at 9:10am10,30,45 9 * * *Runs everyday at 9:10am, 9:30am, and 9:45am0 * 30 JAN 2-6Runs at 0 minute of every hour on weekdays and 30th of January0/20 9-17 * * 2-5Runs every Mon, Tue, Wed, and Thurs at minutes 0, 20, 40 from 9am to 5pm1 2 L-3 * *Runs every third-to-last day of month at 2:01am1 2 6W 3 ?Runs on the nearest weekday to March, 6th every year at 2:01am1 2 * 3 3#2Runs every second Tuesday of March at 2:01am every year0 10,13 * * MON-FRIRuns every weekday at 10am and 1pm



一个coordinator application 的定义包括开始时间、结束时间、执行频率、输入数据、输出数据和被执行的工作流。一个Coordinator Application 在开始时起周期性的执行工作流。

开始执行时,Coordinator Job首先会检查是否输入数据能够获取到。当输入数据存在可用时,workflow Job 处理数据,并产生对应的输出数据。如果输入数据不存在不可用时Workflow Job的执行过程推迟,直到输入数据可用时。若技术时间条件满足时,Coordinator不再执行。

0 0
原创粉丝点击