打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
oozie 工作流调度引擎总结(一)

 

oozie是服务于hadoop生态系统的工作流调度工具,job运行平台是区别于其他调度工具的最大的不同。但其实现的思路跟一般调度工具几乎完全相同。

首先是作为调度系统两大核心:依赖和触发。依赖可以是条件依赖,比如,资源依赖,依赖于某些数据文件的存在,也可以是任务依赖,比如依赖于另一个job的完成。在oozie里,每一个job对应一个action节点,这个节点可以是java,hadoop FS,mapred,hive,sqoop,OS shell等等。job之间的依赖通过动作节点完成,fork,join等。

触发主要指时间触发。依赖和触发在动作的方向上是相互的,依赖是必要条件,而触发是充分条件。

其次,调度系统本身不会去执行具体的job,而是将job相关的所有资源发送到真实的执行环境,比如hadoop jobtractor,hive client,关系型数据库系统等等,自己仅仅记录并监视job的执行状态,并对其状态的变化作出相应的动作,比如,job失败可以重新运行,job成功转到下一个节点。发送job的过程是一个非阻塞的行为,个别例外(比如hadoop fs操作)。

第三,调度系统本身可以是任意程序,例如,linux上的一个脚本程序发起的精灵进程,一个web 工程,也可以是个GUI的软件工具。

oozie作为一个调度引擎,是不同于hadoop的jobtracker实现的调度器的,虽然两者均为”Schedule“之意。oozie负责任务的调度分发,是指从提交作业的本地,将资源发送到job运行环境,比如hadoop集群。这个“分发”行为发生在hadoop集群外。而jobtracker是将hadoop作业拆分成若干个mapred子job,分派给tasktracker去执行。这个”分发“行为发生在hadoop集群内,是应用程序本身的功能,它可以自己选择job执行的先后顺序,或者停止一个正在执行的job,让出资源给另一个job,控制的更为精细。跟传统意义上的调度工具含义不同。

 

值得一提的是,oozie是apache的开源项目,但我们一般用cloudera或yahu的商用免费版,因为后者修复了apache版很多bug,并支持更多的功能。

oozie server是一个java web,可以用内置的tomcat容器,也可以用外部的,记录的信息比如日志等放在数据库中,推荐配置个mysql。

 oozie 的安装是有点复杂的,需要仔细阅读文档。运行oozie应用时,作业配置文件,jar包,相关程序代码,比如hive ql要放在hdfs上,只有属性文件放在本地磁盘。

下面是几个例子:

 coordinator.xml内容:

<coordinator-app name="cron-coord" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="UTC"                 xmlns="uri:oozie:coordinator:0.1">        <action>        <workflow>            <app-path>${workflowAppUri}</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></coordinator-app>

 

workflow。xml内容:

<workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">    <start to="forking"/>    <fork name="forking">        <path start="hive-node"/>        <path start="hive-node2"/>    </fork>    <action name="hive-node">        <hive xmlns="uri:oozie:hive-action:0.2">            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>	    <configuration>                <property>                    <name>mapred.job.queue.name</name>                    <value>${queueName}</value>                </property>                <property>                    <name>oozie.hive.defaults</name>                    <value>my-hive-default.xml</value>                </property>            </configuration>            <script>dim_shop_category2.ql</script>            <param>ARG_OPTIME_ISO=${ARG_OPTIME_ISO}</param>        </hive>        <ok to="joining"/>        <error to="fail"/>    </action>        <action name="hive-node2">        <hive xmlns="uri:oozie:hive-action:0.2">            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>            <configuration>                <property>                    <name>mapred.job.queue.name</name>                    <value>${queueName}</value>                </property>                <property>                       <name>oozie.hive.defaults</name>                    <value>my-hive-default.xml</value>                </property>              </configuration>            <script>dim_shop_category3.ql</script>            <param>ARG_OPTIME_ISO=${ARG_OPTIME_ISO}</param>                </hive>        <ok to="joining"/>        <error to="fail"/>    </action>         <join name="joining" to="hive-node3"/>            <action name="hive-node3">        <hive xmlns="uri:oozie:hive-action:0.2">            <job-tracker>${jobTracker}</job-tracker>            <name-node>${nameNode}</name-node>            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>            <configuration>                <property>                    <name>mapred.job.queue.name</name>                    <value>${queueName}</value>                </property>                <property>                    <name>oozie.hive.defaults</name>                    <value>my-hive-default.xml</value>                </property>            </configuration>            <script>dim_shop_category4.ql</script>        </hive>        <ok to="end"/>        <error to="fail"/>    </action>        <kill name="fail">        <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>    </kill>    <end name="end"/>        </workflow-app>


该程序实现了每十分钟运行一次含有三个hive任务的job,timezone=“UTC”表示中央时区区时,可在oozie-site中配置为东八区时间,GMT+0800.


 

oozie除了通过配置方式,经由oozie client 提交job外,还可以用其api来提交。workflow,properties等都可以通过java api来实现,并提交给oozie server。

oozie动作节点的扩展:

1、继承ActionExcutor编写自定义节点类。

2、为新组建定义schema,并添加到oozie-site配置文件中。

3、 oozie-site.xml中注册新组建。

后面就可以在工作流配置文件中使用新的动作节点了。

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
高可用Hadoop平台-Oozie工作流之Hadoop调度
【Oozie学习之一】Oozie
大数据技术之Azkaban学习
简单之美 | Oozie工作流程定义详解
Azkaban学习之路 (一)Azkaban的基础介绍
基于Hadoop的大数据平台实施——整体架构设计
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服