Oozie支持工作流,其定义通过将多个Hadoop Job的定义按照一定的顺序组织起来,然后作为一个整体按照既定的路径运行。一个工作流已经定义了,通过启动该工作流Job,就会执行该工作流中包含的多个Hadoop Job,直到完成,这就是工作流Job的生命周期。
 
通过最简单的一个例子来了解oozie是如何运行的,运行oozie的服务器必须能够访问HDFS,可以提交hadoop mapreduce任务(如果需要执行hive,spark等任务,同样需要对应的环境)。
 
为了让实例比较简单,任务只是在提交后执行一次,并没有使用coordinator,只是使用了workflow.xml,在workflow中定义任务的整体流程,workflow.xml的定义内容简要如下:
<workflow-app xmlns="uri:oozie:workflow:0.4" name="${sys_name}-MonitorPlus-Task-${task_id}">
<start to=“check-xxx-succ-flag"/> <decision name=“check-xxx-succ-flag">
<switch>
<case to="check-mr-succ-flag">${fs:exists(concat(concat("/xxx/output/xxxList/",
task_id),"/_SUCCESS"))}</case>
<default to=“do-xxx"/>
</switch>
</decision> <decision name="check-mr-succ-flag">
<switch>
<case to="end">${fs:exists(concat(concat(“/xxx/output/", task_id),"/_SUCCESS"))}</case>
<default to="do-mr"/>
</switch>
</decision> <action name=“do-xxx" retry-max="3" retry-interval="10">
<java>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${namenode}</name-node>
<configuration>
<property>
<name>mapreduce.job.queuename</name>
<value>${queueName}</value>
</property>
</configuration>
<main-class>com.xxx.Main</main-class>
...
 
类似于工作流,其中有开始节点 start,一些decision用于流程判断分支节点,以及具体的action,action中可以选择java, shell等类型节点,启动MapReduce任务或者可以选择跳转到某台服务器去启动shell脚本(理论上,如果可以启动shell脚本,就可以做任何在单机上可以做的事情);分支节点可以根据一些条件,比如某个输出目录的_SUCCESS文件是否存在,将以前执行的某些阶段跳过,在执行action时可以设置重试次数以及重试间隔,以避免某次集群环境问题引起的失败。
 
工作流中可以根据需要设置特定的变量参数,以${varibleName}来定义,这样,使用统一的oozie定义来根据传递参数的不同来执行不同的任务。
 
工作流xml文件需要被放在HDFS上才能被oozie调度,如果在启动需要调度MapReduce任务,同样jar包也需要上传到hdfs上,形成下面的目录结构:
 
/xxx/oozie/workflow.xml
/xxx/oozie/lib
/xxx/oozie/lib/mr-1.7-SNAPSHOT-package.jar
/xxx/oozie/lib/xxx.mr-1.7-SNAPSHOT-package.jar
 
在workflow工作流定义的同级目录下,需要有一个lib目录,在lib目录中存在java节点MapReduce使用的jar包。需要注意的是,oozie并不是使用指定jar包的名称来启动任务的,在lib包中绝对不能存在某个jar包的不同版本,不能够出现多个相同主类。
 
工作流中设置的变量,需要通过一个叫做job.properties的配置文件来填充(不能改名称,如果需要多个,请放到不同的文件夹下),job.properties需要配置下面的参数:
 
namenode=hdfs://ns1
jobTracker=xxx.cn:8032
oozie_url=http://xxx.cn:11000/oozie
oozie.wf.application.path=/xxx/oozie/workflow.xml
 
必须要求设置这三个参数namenode,jobTracker,oozie_url,以及任务workflow.xml在hdfs上的位置。其他的参数,视具体的workflow.xml而定,启动oozie的方式为:
 
oozie job -oozie ${oozie_url} -config ${job_cfg} -run
如果oozie是在本机运行,不需要-oozie ${oozie_url},任务提交成功后,就会返回一个oozie任务id,可以在oozie web url中查看该任务的具体执行情况。
 
以上是通过命令行来调用oozie,当然也可以通过java oozie client来调用oozie执行,需要依赖pom:
<dependency>
<groupId>org.apache.oozie</groupId>
<artifactId>oozie-client</artifactId>
<version>4.1.0</version>
</dependency>
可以参考oozie官网中介绍的例子来完成任务提交,这里参照之前的例子,用java实现了一遍:
 
public class WorkflowClient {

    public static final String OOZIE_URL = "http://xxx.cn:11000/oozie";

    private OozieClient oozieClient = new OozieClient(OOZIE_URL);

    public WorkflowClient() {

    }

    /**
* @param workflowDefinition
* @param workflowParameters
* @return - jobId
* @throws org.apache.oozie.client.OozieClientException
*/
public String startJob(Properties properties)
throws OozieClientException {
// create a workflow job configuration and set the workflow application path
Properties configuration = oozieClient.createConfiguration(); Enumeration<?> enumeration = properties.propertyNames();
while (enumeration.hasMoreElements()) {
Object element = enumeration.nextElement();
configuration.setProperty(element.toString(), properties.getProperty(element.toString()).toString());
} return oozieClient.run(configuration);
} public static void main(String[] args) throws OozieClientException, InterruptedException, IOException {
String jobPropertyFile = args[0]; // Create client
WorkflowClient client = new WorkflowClient();
// Create parameters
Properties properties = new Properties();
properties.load(new FileInputStream(new File(jobPropertyFile))); // Start Oozing
String jobId = client.startJob(properties);
SysOutLogger.info("jobId: " + jobId);
WorkflowJob jobInfo = client.oozieClient.getJobInfo(jobId); SysOutLogger.info("job url: " + jobInfo.getConsoleUrl()); while (true) {
Thread.sleep(1000L);
WorkflowJob.Status status = client.oozieClient.getJobInfo(jobId).getStatus();
if (status == WorkflowJob.Status.SUCCEEDED || status == WorkflowJob.Status.FAILED
|| status == WorkflowJob.Status.KILLED) {
SysOutLogger.info("Job finish with status: " + status);
break;
} else {
SysOutLogger.info("job running: " + jobInfo.getStatus());
}
} }
}
 
用maven打包完成后,将其放到服务器端运行:
 
[INFO]  2015-04-16 11:02:18 : jobId: 0000002-150415180413953-oozie-supe-W
[INFO] 2015-04-16 11:02:18 : job url: http://xxx.cn:11000/oozie?job=0000002-150415180413953-oozie-supe-W
[INFO] 2015-04-16 11:02:18 : job running: RUNNING
[INFO] 2015-04-16 11:02:19 : Job finish with status: SUCCEEDED
 
在job提交后,根据jobId,就通过oozieClient获得其WorkflowJob,使用OozieClient对应的API还可以对已经执行的任务进行kill/rerun等操作。由于没有找到ooze对应的事件API,这里是通过定时获取状态的方式将状态打印出来,直到任务完成。从oozie文档中可以查找到,oozie是可以和JMS服务集成,将任务执行状态发送到对应topic上,这样就可以依赖JMS Listener实现类似的事件监听/通知机制。
 
 

oozie工作流相关入门整理的更多相关文章

  1. 高可用Hadoop平台-Oozie工作流之Hadoop调度

    1.概述 在<高可用Hadoop平台-Oozie工作流>一篇中,给大家分享了如何去单一的集成Oozie这样一个插件.今天为大家介绍如何去使用Oozie创建相关工作流运行与Hadoop上,已 ...

  2. Selenium自动化测试框架入门整理

    ​​关注嘉为科技,获取运维新知 本文主要针对Selenium自动化测试框架入门整理,只涉及总体功能及框架要点介绍说明,以及使用前提技术基础要求整理说明.作为开发人员.测试人员入门参考. 本文参考:Se ...

  3. Oozie工作流属性配置的方式与策略

    本文原文出处: http://blog.csdn.net/bluishglc/article/details/46049817 Oozie工作流属性配置的三种方式 Oozie有三种方法可以给工作流提供 ...

  4. Activity工作流(2)-入门安装运行第一个例子

    转: Activity工作流(2)-入门安装运行第一个例子 置顶 2017年05月24日 15:58:50 li_ch_ch 阅读数:24432   版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  5. BAT 前端开发面经 —— 吐血总结 前端相关片段整理——持续更新 前端基础精简总结 Web Storage You don't know js

    BAT 前端开发面经 —— 吐血总结   目录 1. Tencent 2. 阿里 3. 百度 更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了阿里的内推及腾讯和百度的实习生招聘, ...

  6. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  7. latch相关视图整理

    latch相关视图整理(原创) V$LATCH V$LATCH视图在选取X$KSLLT记录时,进行了Group By及SUM运算,从而得出了一个汇总信息,保存了自实例启动后各类栓锁的统计信息.常用于当 ...

  8. EasyUI相关知识点整理

    EasyUI相关知识整理 EasyUI是一种基于jQuery.Angular..Vue和React的用户界面插件集合.easyui为创建现代化,互动,JavaScript应用程序,提供必要的功能.也就 ...

  9. Asp.Net Core WebAPI入门整理(三)跨域处理

    一.Core  WebAPI中的跨域处理  1.在使用WebAPI项目的时候基本上都会用到跨域处理 2.Core WebAPI的项目中自带了跨域Cors的处理,不需要单独添加程序包 3.使用方法简单 ...

随机推荐

  1. $.ajaxSetup

    <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> ...

  2. 第7课:sql注入、操作session、cookie实例、网络编程、操作Excel

    1. 简单讲一些sql注入的内容 name = 'zdq' sex = '女' cur.execute("select * from bt_stu where real_name='%s'& ...

  3. 海康威视 嵌入到web页面相关问题

    因项目上面需求,接触到了海康威视的设备,要把他嵌入到web页面中,所以就开始了爬坑之路 刚开始不知道如何把设备的页面嵌入到项目的web页面中,直到我遇见了他——“WEB3.0控件开发包V1.0.9_C ...

  4. Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

    一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在pytho ...

  5. vim学习相关链接

    1:http://blog.csdn.net/niushuai666/article/details/7275406 2:http://ju.outofmemory.cn/entry/79671 3. ...

  6. IOS开发 警告 All interface orientations must be supported unless the app requires full screen.

    在IOS开发中遇到警告  All interface orientations must be supported unless the app requires full screen. 只要勾上R ...

  7. 自回归模型(AR )

    2017/7/2 19:24:15 自回归模型(Autoregressive Model,简称 AR 模型)是最常见的平稳时间序列模型之一.接下将介绍 AR 模型的定义.统计性质.建模过程.预测及应用 ...

  8. MVC MVVM和传统三层的理解

    才学疏浅,请勿喷,如果有理解不对的地方请留言 其实,每个小小的程序员都有个毛病,就是反复写一个东西会觉得这个东西没有新意. 就像让你写三层,你却还是觉得想写MVC模式. 软件小公司做B/S的大部分还是 ...

  9. 10day1

    但愿复赛的时候旁边坐的不是学军镇海杭二绍一的众神犇.   阅览室 模拟 [问题描述] 一个阅览室每天都要接待大批读者.阅览室开门时间是 0,关门时间是 T.每位读者的到达时间都 不一样,并且想要阅读的 ...

  10. spring加载jar包中多个配置文件(转载)

    本文转载自:http://www.cnblogs.com/GarfieldTom/p/3723915.html