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. JWT的详细简介

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场 ...

  2. c# 获取随机数字/字符/时间

    using System; using System.Text; namespace HuaTong.General.Utility { /// <summary> /// 随机字符/数字 ...

  3. macOS 下安装SDKMAN 软件开发工具包管理器

    SDKMAN 软件开发工具包管理器的安装非常简单,只需要打开终端,执行: $ curl -s "https://get.sdkman.io" | bash 就OK了,输出类似如下: ...

  4. Leetcode 590. N-ary Tree Postorder Traversal

    DFS,递归或者栈实现. """ # Definition for a Node. class Node: def __init__(self, val, childre ...

  5. python基础(二)----数据类型

    Python基础第二章 二进制 字符编码 基本数据类型-数字 基本数据类型-字符串 基本数据类型-列表 基本数据类型-元组 可变.不可变数据类型和hash 基本数据类型-字典 基本数据类型-集合 二进 ...

  6. iOS 11 Xcode 开发包SDK

    一不小心,手机又升级了,哎

  7. node.js 之爬虫

    1. cheerio 与 request request:模拟客户端行为,对页面进行请求 cheerio:对服务器端返回的页面进行解析: var cheerio = require('cheerio' ...

  8. python 帮助和导入路径

    1 help('**'),查看函数用法,其中**为内置的函数 help(**.**),模块.函数,查看非内置函数 2 先添加路径到sys,再导入 import sys;sys.path.append( ...

  9. js之瀑布流的实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 阿里面试题,N个士兵的通话问题

    战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通 ...