Oozie是一个基于工作流引擎的开源框架,是由Cloudera公司贡献给Apache的,它能够提供对Hadoop MapReduce和Pig Jobs的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。
Oozie工作流定义,同JBoss jBPM提供的jPDL一样,也提供了类似的流程定义语言hPDL,通过XML文件格式来实现流程的定义。对于工作流系统,一般都会有很多不同功能的节点,比如分支、并发、汇合等等,Oozie也有类似的一些概念,不做过多解释,更多信息可以参考相关文档。
这里,简单描述一下,Oozie定义了控制流节点(Control Flow Nodes)和动作节点(Action Nodes),其中控制流节点定义了流程的开始和结束,以及控制流程的执行路径(Execution Path),如decision、fork、join等;而动作节点包括Hadoop map-reduce、Hadoop文件系统、Pig、SSH、HTTP、eMail和Oozie子流程。
下面我们看一下,官方文档中给出的定义流程的例子,流程定义示例如图所示:
这个流程图表达了WordCount统计词频的流程编排功能,非常简单,启动执行一个MapReduce任务,如果成功则正常结束,如果失败则取消该任务。
上图对应的hPDL定义文件,内容如下所示:
01 |
< workflow-app name = 'wordcount-wf' xmlns = "uri:oozie:workflow:0.1" >
|
02 |
< start to = 'wordcount' />
|
03 |
< action name = 'wordcount' >
|
04 |
< map-reduce >
|
05 |
< job-tracker >${jobTracker}</ job-tracker >
|
06 |
< name-node >${nameNode}</ name-node >
|
07 |
< configuration >
|
08 |
< property >
|
09 |
< name >mapred.mapper.class</ name >
|
10 |
< value >org.myorg.WordCount.Map</ value >
|
11 |
</ property >
|
12 |
< property >
|
13 |
< name >mapred.reducer.class</ name >
|
14 |
< value >org.myorg.WordCount.Reduce</ value >
|
15 |
</ property >
|
16 |
< property >
|
17 |
< name >mapred.input.dir</ name >
|
18 |
< value >${inputDir}</ value >
|
19 |
</ property >
|
20 |
< property >
|
21 |
< name >mapred.output.dir</ name >
|
22 |
< value >${outputDir}</ value >
|
23 |
</ property >
|
24 |
</ configuration >
|
25 |
</ map-reduce >
|
26 |
< ok to = 'end' />
|
27 |
< error to = 'end' />
|
28 |
</ action >
|
29 |
< kill name = 'kill' >
|
30 |
< message >Something went wrong: ${wf:errorCode('wordcount')}</ message >
|
31 |
</ kill >
|
32 |
< end name = 'end' />
|
33 |
</ workflow-app >
|
这个XML文件描述地就是上图表达的流程含义,如果熟悉Hadoop平台的话,对上面的内容非常容易理解。当然,这里只有一个MapReduce任务,试想如果一个计算系统需要执行更加复杂的逻辑,比如对应很多个MR,还有其他类似的动作节点(Action Nodes),如果能够通过流程描述出来,加上可视化功能,非常直观,省去了我们手工进行编排的麻烦。
另外,Oozie还具有很多功能,而且扩展性很好。更多内容,可以查看文档:http://archive.cloudera.com/cdh4/cdh/4/oozie/。