Oozie简介

来源:互联网 发布:剑三大师捏脸数据 编辑:程序博客网 时间:2024/06/05 16:32

Oozie之workflow

        Apache Oozie是运行在hadoop平台上的一种工作流调度引擎,它可以用来调度与管理hadoop任务,如,MapReducePig等。那么,对于OozieWorkflow中的一个个的action(可以理解成一个个MapReduce任务)Oozie是根据什么来对action的执行时间与执行顺序进行管理调度的呢?答案就是我们在数据结构中常见的有向无环图(DAGDirect Acyclic Graph)的模式来进行管理调度的,我们可以利用HPDL语言(一种xml语言)来定义整个workflow,以MapReduce任务来进行举例说明:

        假设有5action(a,b,c,d,e,f,g)组成一个工作流,其中包含了主要的三个动作:decisionjoinfork,如图1所示:

1 Oozie WorkFlow

1 Oozie WorkFlow

      由图可以看出其workflow为一个有向无环图,其中action节点为a,b,c,d,e,f,g五个节点,startendfail为工作流控制节点,其执行顺序为:a执行结束后会进行一个decision,也就是判断会选择bcd那一条分支走下去,我们假设b分支满足条件,b执行后出现两个分支ef并行(fork),ef运行结束后合并为一个任务gjoin)。

代码如下:

<workflow-app xmlns='uri:oozie:workflow:0.1' name='NGMB-IPS-ingestion'>//从action  a开始<start to='a'/>//action  a配置(hadoop streaming) <action name="a">        <map-reduce>            <job-tracker>jobtracker的设置</job-tracker>            <name-node>namenode的设置</name-node>            //提前预处理操作,比如新建一个文件夹,或删除以前不用的数据等等            <prepare>                <delete path="${output}"/>            </prepare>            <streaming>                <mapper>map脚本的路径</mapper>                <reducer>reduce脚本的路径</reducer>            </streaming>            //参数的设置,比如map的个数、map的内存大小等参数的设置            <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="mydecision"/>        <error to="fail"/>    </action>    //decision判断操作    <decision name="mydecision">        <switch>            <case to="b">            判断条件            </case>             <case to="c">             判断条件                        </case>            <case to="d">              判断条件            </case>            <default to="end"/>        </switch>    </decision>   //action  b配置   <action name='b'>    //中间的配置可以参考action  a    //完成action  b并行执行c和d任务(两个任务称为merging)          <ok to="merging"/>    <error to="fail"/>   </action>//e和f并行操作  <fork name="merging">          <path start="e"/>        <path start="f"/></fork>//action  e配置<action name='e'>    //中间的配置可以参考action  a    //当e和f完成后执行join操作     <ok to="joining"/>     <error to="fail"/>  </action>//action  f配置<action name='f'>    //中间的配置可以参考action  a    //当e和f完成后执行join操作    <ok to="joining"/>    <error to="fail"/></action>//合并join操作 action  g<join name="joining" to="g"/>//action  g配置<action name='g'>    //中间的配置可以参考action  a    <ok to="end"/>    <error to="fail"/></action>   <end name='end'/></workflow-app>

       Oozie可以对workflow中的每一步进行监控,当每一个action结束时,Oozie可以通过回调和轮询两种不同的方式来检测计算或处理任务是否完成。当Oozie启动了计算或处理任务的时候,它会为任务提供唯一的回调URL,然后任务会在完成的时候发送通知给特定的URL。在任务无法触发回调URL的情况下,Oozie有一种机制,可以对计算或处理任务进行轮询,从而保证能够完成任务。

Oozie之Coordinator

       工作流已经定义了,从stratend即为该工作流的生命周期,但是当我们想在某一个时间或根据数据的可用性来触发workflow的时候,OozieCoordinator可以用来满足我们的需求。它就相当于Oozieworkflow的协调器,来管理管理这个工作流的运行,如在什么条件下开始运行,以及触发的频率等。控制开始时间和执行频率的具体例子如下:

//${coord:hours(6)}从开始的时间开始每6个小时执行一次,${start}开始时间,${end}结束时间<coordinator-app name="调度器名称" frequence="${coord:hours(6)}" start="${start}" end="${end}" timezoe="时区" xmlns="uri:oozie:coordinator:0.2">  <action>      <workflow>          <app-path>workflow的xml文件的路径</app-path>                  //配置参数        <configuration>              <property>                  <name>jobTracker</name>                  <value>${jobTracker}</value>              </property>              <property>                  <name>nameNode</name>                  <value>${nameNode}</value>              </property>              <property>                  <name>queueName</name>                  <value>${queueName}</value>              </property>          </configuration>      </workflow>  </action>

       对于利用数据可用性来触发的过程,我们可以理解为:当输入的数据已经准备好了,或者当需要利用的数据已经上传到数据库指定的位置的时候,即可触发workflow的执行,具体的例子如下:

//对于有时间设置的数据来说,检查从2009年01月开始每个三个月的数据文件,直到trigger.dat存在在这个数据路径的时候,workflow才会触发执行。<dataset name="stats" frequency="${coord:months(3)}"           initial-instance="2009-01-31T20:00Z" timezone="America/Los_Angeles">    <uri-template>      hdfs://foo:8020/usr/app/stats/${YEAR}/${MONTH}/data    </uri-template>    <done-flag>trigger.dat</done-flag> </dataset>    hdfs://foo:8020/usr/app/stats/2009/01/data/trigger.dathdfs://foo:8020/usr/app/stats/2009/04/data/trigger.dathdfs://foo:8020/usr/app/stats/2009/07/data/trigger.dat



原创粉丝点击