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实现类似的事件监听/通知机制。
相关推荐
本文主要讲述在Hue平台使用Oozie工作流操作Sqoop工具将MySQL数据库的数据传输到HDFS中,并最终导入到Hive表中的经验。以下是详细知识点: 1. Hue平台和Oozie工作流简介: Hue是一种开源的用户界面,用于简化与...
从零开始讲解大数据调度系统构成,集成大数据计算任务构建大数据工作流,基于Oozie构建实现企业级自动化任务开发 课程亮点 1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为简,讲解...
一个在Apache Oozie工作流和Apache Airflow工作流之间轻松转换的工具。 Apache Airflow 是 AirBnB 于 2014 年开发的工作流管理系统。它是一个以编程方式编写、调度和监控工作流的平台。气流工作流被设计为Python 中...
### 大数据技术之Oozie入门到精通 #### 一、Oozie简介与应用场景 **Oozie**是一款开源的工作流调度系统,主要用于在Hadoop生态系统中管理和执行复杂的数据处理任务。它通过定义一系列有依赖关系的操作来实现工作流...
本文针对现有数据挖掘软件无法支持用户定制并行数据挖掘算法,以及无法充分利用计算集群资源的局限性,提出了利用Hadoop技术,特别是Mahout和Oozie组件,在Hadoop上构建分布式数据挖掘工作流的方法,并通过设计实现...
### Oozie工作流引擎详解 #### 一、Oozie基本介绍 Oozie是一款由Apache基金会维护的开源工作流调度管理系统,主要用于管理和编排Hadoop生态系统中的各种任务。通过对不同类型的任务进行编排和调度,Oozie帮助...
oozie 入门 oozie概述:oozie能干什么 oozie格式:怎么用oozie oozie执行:怎么运行oozie
Oozie 是一个用于管理工作流和协调数据处理任务的开源工具,主要用于在 Hadoop 生态系统中实现复杂的工作流调度。它通过定义一系列任务及其之间的依赖关系来自动化执行大数据处理流程。 #### 二、Oozie 的核心功能 ...
在Oozie的实际部署和使用过程中,需要考虑到系统部署和维护的各个方面,例如在derby或mysql数据库中存储工作流的相关信息。此外,在展望未来的发展时,可以预见Oozie将继续优化其调度机制,提高容错能力和用户体验,...
3. **上传和验证工作流**:将工作流XML文件和相关的作业资源(如Hive脚本、MapReduce JAR文件)上传到HDFS,并使用Oozie客户端工具进行验证。 4. **提交和启动工作流**:通过Oozie客户端提交工作流,并启动作业。 5....
在Hadoop生态系统中,Oozie是一个工作流调度系统,用于管理Hadoop作业。它允许用户定义、调度和协调各种Hadoop相关任务,如MapReduce、Pig、Hive、Sqoop等。当遇到“Table ‘oozie.VALIDATE_CONN’ doesn’t exist”...
在大数据处理领域,Oozie是一个非常重要的工作流管理系统,主要用于协调Hadoop生态系统中的各种任务。OozieWeb界面是Oozie的用户交互部分,允许用户通过Web浏览器进行工作流的提交、监控和管理。在描述中提到的...
Hadoop是一个开源的分布式计算平台,主要由Apache软件基金会维护。它被设计用来在普通硬件构建的集群环境中存储和处理大量数据。Hadoop的核心特性包括: 1. **分布式存储**:Hadoop分布式文件系统(HDFS)可以存储...
生成Oozie工作流可能是一项繁琐的任务,对XML进行编码并不好,因此您可以使用process_templates.py脚本从Jinja模板中生成它们。 安装模块 # pip install slippinj 关于依赖关系,cx_Oracle是一个Python扩展模块,使...
Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,是用来管理Hadoop作业,属于web应用程序,
**Oozie工作流与Jigsaw UI** Oozie是一个开源的工作流调度系统,它能够管理和协调Hadoop生态系统中的各种任务。Oozie是Apache软件基金会的一个顶级项目,旨在简化大数据处理过程中的作业管理和调度。它支持Hadoop ...
Apache Oozie是Hadoop生态系统中的一个关键组件,主要用于调度和管理工作流,是管理大数据作业的先进工具。Oozie可以调度一系列作业,这些作业可以是MapReduce任务,也可以是Hive查询或者Pig脚本等。它支持定时调度...
2. **构建Oozie工作流**:创建一个Oozie工作流定义文件(`workflow.xml`),指定Spark动作并配置相关参数。例如: ```xml <workflow-app name="spark-sql-workflow" xmlns="uri:oozie:workflow:0.5"> ...
Oozie的基本执行原理是通过workflow.xml文件定义工作流,用户在job.properties中配置相关参数。提交工作流时,Oozie Server会通过RESTful API接收请求,并异步地将作业提交给Hadoop执行。这种异步机制使得用户可以...
Apache Oozie 是一个工作流调度系统,用于管理和协调Hadoop生态系统中的作业。Oozie 5.2.1是该软件的一个版本,提供了一系列改进和修复,旨在提高稳定性和性能。这个"oozie-5.2.1-distro.tar.gz"文件是一个压缩包,...