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. Django中通过定时任务触发页面静态化的方式

    安装 pip install django-crontab 添加应用 INSTALLED_APPS = [ ... 'django_crontab', # 定时任务 ... ] 设置任务的定时时间 在 ...

  2. PostgreSQL 9.6 同步多副本、remote_apply记录

    摘自:https://yq.aliyun.com/articles/61274 同步多副本配置方法 参数配置如下 synchronous_standby_names (string) 支持两种写法 n ...

  3. azure最佳实践系列1-自我修复的设计

    如何设计你的应用,能够在系统错误时做到自我修复?在分布式系统中,会经常遇到错误.硬件也会遇到异常情况.网络有时会出现短暂的错误.整个地区出现了服务中断.即便如此,关于这些问题的方案也是要提前规划的.因 ...

  4. Jenkins简单的使用

    1.每个版本开发提单子,写清楚发布那个项目.配置文件.所执行SQL语句等:QA开始部署测试环境 2.如下时发布项目 一.版本发布 登陆系统,选择对应的项目(以api-gateway为例,如果找不到对应 ...

  5. apt-get -f install

    http://zhidao.baidu.com/link?url=tZLEfm1Ycc1pWS67-95fXU596CtwA_1l2pPfzINUTxvOCvWdf3JZsWuZNxsxn0Jv6Om ...

  6. Linux shell multifile content replace with sed

    #!/bin/bash # Linux shell multifile content replace with sed # 声明: # 本源代码主要是利用两份(中.英文)具有相同键值对的json数据 ...

  7. 程序设计入门-C语言基础知识-翁恺-第二周:简单的计算程序-详细笔记(二)

    目录 第二周:判断 2.1 比较 2.2 判断 2.3 课后习题 第二周:判断 2.1 比较 简单的判断语句: if(条件成立){ //执行代码 } 条件 计算两个值之间的关系,所以叫做关系运算 关系 ...

  8. HDU - 6172:Array Challenge (BM线性递推)

    题意:给出,三个函数,h,b,a,然后T次询问,每次给出n,求sqrt(an); 思路:不会推,但是感觉a应该是线性的,这个时候我们就可以用BM线性递推,自己求出前几项,然后放到模板里,就可以求了. ...

  9. 对Json的各种遍历方法

    慎用for in函数(有可能由于原型链的问题导致遍历问题): 如果要是用for in  一定要使用if (obj1.hasOwnProperty(key)) {}先做判断 解决方法 :1.eval() ...

  10. c语言标识符

    在程序中使用的变量名.函数名.标号等统称为标识符. 除库函数的函数名由系统定义外,其余都由用户自定义. C 规定,标识符只能是字母(A-Z,a-z).数字(0-9).下划线()组成的字符串,并且其第一 ...