文档章节

oozie基本概念

枯藤KT
 枯藤KT
发布于 2016/10/10 11:11
字数 1881
阅读 87
收藏 0

基础文档

工作流不能循环, 其中的节点包括:控制流节点(start, end, decision, fork, join, kill) ,动作流节点 (map-reduce, pig, etc.)。

控制流节点:

1.  start节点:

A workflow definition must have one start node.

Syntax:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
  ...
  <start to="[NODE-NAME]"/>
  ...
</workflow-app>

The to attribute is the name of first workflow node to execute.

Example:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <start to="firstHadoopJob"/>
    ...
</workflow-app>

2.  end节点:

A workflow definition must have one end node,如果有一个流程分支到达了end节点,其它的分支流程会被杀掉,并且认为运行成功。

Syntax:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    ...
    <end name="[NODE-NAME]"/>
    ...
</workflow-app>

The name attribute is the name of the transition to do to end the workflow job.

Example:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <end name="end"/>
</workflow-app>

3.  kill节点:

A workflow definition may have zero or more kill nodes.

Syntax:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    ...
    <kill name="[NODE-NAME]">
        <message>[MESSAGE-TO-LOG]</message>
    </kill>
    ...
</workflow-app>

The name attribute in the kill node is the name of the Kill action node.

The content of the message element will be logged as the kill reason for the workflow job.

A kill node does not have transition elements because it ends the workflow job, as KILLED .

Example:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <kill name="killBecauseNoInput">
        <message>Input unavailable</message>
    </kill>
    ...
</workflow-app>

4.  decision 节点,根据EL表达式条件,控制流程的走向,类似switch-case语句:

Syntax:

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1">
    ...
    <decision name="[NODE-NAME]">
        <switch>
            <case to="[NODE_NAME]">[PREDICATE]</case>
            ...
            <case to="[NODE_NAME]">[PREDICATE]</case>
            <default to="[NODE_NAME]"/>
        </switch>
    </decision>
    ...
</workflow-app>

case分支依次进行测试,直到找到一个条件为true的分支

所有分支都不满足,执行default分支

所有的decision分支,必须有一个default分支

Example:

<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <decision name="mydecision">
        <switch>
            <case to="reconsolidatejob">
              ${fs:fileSize(secondjobOutputDir) gt 10 * GB}
            </case> <case to="rexpandjob">
              ${fs:fileSize(secondjobOutputDir) lt 100 * MB}
            </case>
            <case to="recomputejob">
              ${ hadoop:counters('secondjob')[RECORDS][REDUCE_OUT] lt 1000000 }
            </case>
            <default to="end"/>
        </switch>
    </decision>
    ...
</workflow-app>

5.  Fork 和 Join 节点:

fork将一个分支分成多个并发执行的路径,join节点等待所有fork分割成的分支到达。

这两个节点必须成对使用,join认为到达的每一个分支属于同一个fork节点。

Syntax:

<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]" />
    </fork>
    ...
    <join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />
    ...
</workflow-app>

path表明由fork分成的多个并发执行路径。join节点的to属性,将在所有的分支到达后执行。

Example:

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <fork name="forking">
        <path start="firstparalleljob"/>
        <path start="secondparalleljob"/>
    </fork>
    <action name="firstparallejob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <job-xml>job1.xml</job-xml>
        </map-reduce>
        <ok to="joining"/>
        <error to="kill"/>
    </action>
    <action name="secondparalleljob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <job-xml>job2.xml</job-xml>
        </map-reduce>
        <ok to="joining"/>
        <error to="kill"/>
    </action>
    <join name="joining" to="nextaction"/>
    ...
</workflow-app>

默认情况下,oozie会对每一个fork进行一些验证,以避免错误的fork。如果确认作业可以正常运行,可以禁用oozie的这些验证。job.properties文件中设置oozie.wf.validate.ForkJoin=false,禁用单个工作流中的验证;oozie-site.xml文件中设置oozie.validate.ForkJoin=false,禁用所有的工作流验证。是否进行验证取决于这两个设置,只有都设置为true或不设置,才进行验证。

Workflow Action Nodes:
 Map-Reduce Action:

必须配置好必要的jobconf属性

Hadoop JobConf properties can be specified as part of

  • the config-default.xml or
  • JobConf XML file bundled with the workflow application or
  • tag in workflow definition or
  • Inline map-reduce action configuration or
  • An implementation of OozieActionConfigurator specified by the tag in workflow definition.

加载顺序为: streaming , job-xml , configuration , andconfig-class ,后面的覆盖前面的。mapred.job.tracker 和 fs.default.name properties 不能出现在job-xml 和 inline configuration中。

为job添加需要的文件和jar包:

#######占位#########

通过java配置mapreduce任务:实现OozieActionConfigurator接口, 在工作流的config-class元素下,配置该实现类。

public interface OozieActionConfigurator {
    public void configure(JobConf actionConf) throws OozieActionConfiguratorException;
}

之前配置的jobconf属性,已经包含在actionConf中了,这个方式oozie在最后调用。

Stream:内容待丰富

在streaming元素中配置,包含mapper和reducer元素,用来指定map和reduce脚本。

使用的脚本必须在streaming的file元素中指定,如果不指定,则代表在slave的PATH中可用。

一样通过file和archive元素指定要使用到的文件。

配置的mapper和reducer可以在job-xml元素指定的文件中,使用mapred.mapper.class 和mapred.reducer.class 覆盖(设置为新的map和reduce脚本),或者configuration 元素中也可以覆盖。

job-xml元素:指向hadoop JobConf的job.xml,可以按顺序指定多个文件。

configuration :设置jobconf对象的相关属性,会覆盖job-xml文件中设置的相同属性。

config-class :会覆盖configuration中设置的属性。

External Stats can be turned on/off by specifying the property oozie.action.external.stats.write as true or false in the configuration element of workflow.xml. The default value for this property is false .

The file element, if present, must specify the target symbolic link for binaries by separating the original file and target with a # (file#target-sym-link). This is not required for libraries.

The mapper and reducer process for streaming jobs, should specify the executable command with URL encoding. e.g. '%' should be replaced by '%25'.

Syntax

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5">
    ...
    <action name="[NODE-NAME]">
        <map-reduce>
            <job-tracker>[JOB-TRACKER]</job-tracker>
            <name-node>[NAME-NODE]</name-node>
            <prepare>
                <delete path="[PATH]"/>
                ...
                <mkdir path="[PATH]"/>
                ...
            </prepare>
            <streaming>
                <mapper>[MAPPER-PROCESS]</mapper>
                <reducer>[REDUCER-PROCESS]</reducer>
                <record-reader>[RECORD-READER-CLASS]</record-reader>
                <record-reader-mapping>[NAME=VALUE]</record-reader-mapping>
                ...
                <env>[NAME=VALUE]</env>
                ...
            </streaming>
			<!-- Either streaming or pipes can be specified for an action, not both -->
            <pipes>
                <map>[MAPPER]</map>
                <reduce>[REDUCER]</reducer>
                <inputformat>[INPUTFORMAT]</inputformat>
                <partitioner>[PARTITIONER]</partitioner>
                <writer>[OUTPUTFORMAT]</writer>
                <program>[EXECUTABLE]</program>
            </pipes>
            <job-xml>[JOB-XML-FILE]</job-xml>
            <configuration>
                <property>
                    <name>[PROPERTY-NAME]</name>
                    <value>[PROPERTY-VALUE]</value>
                </property>
                ...
            </configuration>
            <config-class>com.example.MyConfigClass</config-class>
            <file>[FILE-PATH]</file>
            ...
            <archive>[FILE-PATH]</archive>
            ...
        </map-reduce>        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>

Streaming Example:

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="firstjob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <prepare>
                <delete path="${output}"/>
            </prepare>
            <streaming>
                <mapper>/bin/bash testarchive/bin/mapper.sh testfile</mapper>
                <reducer>/bin/bash testarchive/bin/reducer.sh</reducer>
            </streaming>
            <configuration>
                <property>
                    <name>mapred.input.dir</name>
                    <value>${input}</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>${output}</value>
                </property>
                <property>
                    <name>stream.num.map.output.key.fields</name>
                    <value>3</value>
                </property>
            </configuration>
            <file>/users/blabla/testfile.sh#testfile</file>
            <archive>/users/blabla/testarchive.jar#testarchive</archive>
        </map-reduce>
        <ok to="end"/>
        <error to="kill"/>
    </action>
  ...
</workflow-app>

Pipes Example:

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
    ...
    <action name="firstjob">
        <map-reduce>
            <job-tracker>foo:8021</job-tracker>
            <name-node>bar:8020</name-node>
            <prepare>
                <delete path="${output}"/>
            </prepare>
            <pipes>
                <program>bin/wordcount-simple#wordcount-simple</program>
            </pipes>
            <configuration>
                <property>
                    <name>mapred.input.dir</name>
                    <value>${input}</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>${output}</value>
                </property>
            </configuration>
            <archive>/users/blabla/testarchive.jar#testarchive</archive>
        </map-reduce>
        <ok to="end"/>
        <error to="kill"/>
    </action>
  ...
</workflow-app>

FS 动作(HDFS动作):

支持的命令有:move , delete , mkdir , chmod , touchz 和 chgrp 。是同步执行的,job会等待命令完成。

路径可以参数化,使用EL表达式获取,每个文件必须指定uri,move元素,target一定不能指定uri。

Path names specified in the fs action can be parameterized (templatized) using EL expressions. Path name should be specified as a absolute path. In case of move , delete , chmod and chgrp commands, a glob pattern can also be specified instead of an absolute path. For move , glob pattern can only be specified for source path and not the target.

fs元素中指定的命令,并不是原子自行的,如果中间失败的话,已经成功的命名不会rollback。在执行fs的任何命令之前,都会验证路径,以确保源路径存在,目的路径不存在。

Syntax:

<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='[SOURCE-PATH]' target='[TARGET-PATH]'/>
            ...
            <chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' />
            <!-- 默认修改目录和该目录下的文件,不包括子目录,若仅仅修改目录,设置dir-files=false;若
            递归修改权限,在chmod元素下添加recursive 元素。chgrp与此类似-->
            ...
            <touchz path='[PATH]' />   <!-- 只能是绝对路径 -->
            ...
            <chgrp path='[PATH]' group='[GROUP]' dir-files='false' />
        </fs>
        <ok to="[NODE-NAME]"/>
        <error to="[NODE-NAME]"/>
    </action>
    ...
</workflow-app>

Example:

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.5">
    ...
    <action name="hdfscommands">
         <fs>
            <delete path='hdfs://foo:8020/usr/tucu/temp-data'/>
            <mkdir path='archives/${wf:id()}'/>
            <move source='${jobInput}' target='archives/${wf:id()}/processed-input'/>
            <chmod path='${jobOutput}' permissions='-rwxrw-rw-' dir-files='true'><recursive/></chmod>
            <chgrp path='${jobOutput}' group='testgroup' dir-files='true'><recursive/></chgrp>
        </fs>
        <ok to="myotherjob"/>
        <error to="errorcleanup"/>
    </action>
    ...
</workflow-app>

schema 0.4中:

<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.4">
    ...
    <action name="hdfscommands">
        <fs>
           <name-node>hdfs://foo:8020</name-node>
           <job-xml>fs-info.xml</job-xml>
           <configuration>
             <property>
               <name>some.property</name>
               <value>some.value</value>
             </property>
           </configuration>
           <delete path='/usr/tucu/temp-data'/>
        </fs>
        <ok to="myotherjob"/>
        <error to="errorcleanup"/>
    </action>
    ...
</workflow-app>

© 著作权归作者所有

枯藤KT

枯藤KT

粉丝 4
博文 104
码字总数 62438
作品 0
昌平
程序员
私信 提问
Apache Oozie Installation

oozie就是一个workflow协调系统,主要用来管理Hadoop作业(job)。属于web应用程序,由oozie client和oozie server两个组件构成。oozie server运行于java servlet容器(tomcat)中的web程序。由...

candon123
2017/12/14
0
0
【Oozie-4.1.0】Oozie-4.1.0 + hadoop-2.7.1

一、环境 maven-3.3.0 hadoop-2.7.1 二、编译 http://apache.mirrors.pair.com/oozie/4.1.0/oozie-4.1.0.tar.gz 三、配置 四、examples job.properties workflow.xml lib/oozie-examples-4.1......

HarryWu
2016/06/19
236
1
安装Oozie4.1.0-CDH版本

安装oozie经历了好长的时间,先是源码包,但是放弃了。。。 然后就是安装的这个CDH版本的,弄了好久,经常报各种错误。 最后整理出来这篇。 这个安装过程同样适用于oozie4.1.0的其他的CDH版本...

白话
2018/06/26
0
0
oozie使用中的一些小结(持续完善)

0 关于oozie 寻找包寻找位置原则: oozie在运行的时候 只会去两个地方寻找自己需要的lib eg: /user/root/examples/apps/fork-merge的workflow下有 job.properties lib workflow.xml三个目录 ...

Zero零_度
2016/09/23
65
0
CM启动 Oozie 服务器 Web 控制台

默认情况下Cloudera Manager是没有开启Oozie web console的。 在打开Oozie Web UI时会出现下面的错误: http://172.16.29.10:11000/oozie/ Oozie web console is disabled. To enable Oozie ......

lichangzai
2018/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
4
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
2
0
【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式

原文作者: Jose Alcérreca 原文地址: ViewModels and LiveData: Patterns + AntiPatterns 译者:秉心说 View 和 ViewModel 分配责任 理想情况下,ViewModel 应该对 Android 世界一无所知。...

秉心说
昨天
7
0
重学计算机组成原理(十二) - 异常和中断

1 概览 完好的程序都满足以下特征 自动运行 我们的程序和指令都是一条条顺序执行,不需要通过键盘或者网络给这个程序任何输入 正常运行 没有遇到计算溢出之类的程序错误。 不过,现实的软件世...

JavaEdge
昨天
4
0
程序设计基础(C)第06讲例程

1summing.c /* summing.c -- 根据用户键入的整数求和 */#include <stdio.h>int main(void){ long num; long sum = 0L; /* 把sum 初始化为0 */ int status; p......

树人大学数字媒体吴凡
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部