background image

JAVA 开发】:Java Web 应用程序:Oozie 及其使用方

在 Hadoop 中执行的任务有时候需要把多个 Map/Reduce 作业连接到一起,这样才能够达
到目的。[1]在 Hadoop 生态圈中,有一种相对比较新的组件叫做 Oozie[2],它让我们可以
把多个 Map/Reduce 作业组合到一个逻辑工作单元中,从而完成更大型的任务。本文中,
我们会向你介绍 Oozie 以及使用它的一些方式。
  什么是 Oozie?
  Oozie 是一种 Java Web 应用程序,它运行在 Java servlet

——

容器

即 Tomcat——中,

并使用数据库来存储以下内容:
  ●工作流定义
  ●当前运行的工作流实例,包括实例的状态和变量
  Oozie 工作流是放置在控制依赖 DAG(

 

有向无环图 Direct Acyclic Graph)中的一组动作

(例如,Hadoop 的 Map/Reduce 作业、Pig 作业等),其中指定了动作执行的顺序。我们会使
用 hPDL(一种 XML 流程定义语言)来描述这个图。
  hPDL 是一种很简洁的语言,只会使用少数流程控制和动作节点。控制节点会定义执
行的流程,并包含工作流的起点和终点(start、end 和 fail 节点)以及控制工作流执行路径的
机制(decision、fork 和 join 节点)。动作节点是一些机制,通过它们工作流会触发执行计算
或者处理任务。Oozie

 

为以下类型的动作提供支持: Hadoop map-reduce、Hadoop 文件系统 、

Pig、Java 和 Oozie 的子工作流(SSH 动作已经从 Oozie schema 0.2 之后的版本中移除了)。
  所有由动作节点触发的计算和处理任务都不在 Oozie

——

之中

它们是由 Hadoop 的

Map/Reduce 框架执行的。这种方法让 Oozie 可以支持现存的 Hadoop 用于负载平衡、灾难恢
复的机制。这些任务主要是异步执行的(只有文件系统动作例外,它是同步处理的)。这意
味着对于大多数工作流动作触发的计算或处理任务的类型来说,在工作流操作转换到工
作流的下一个节点之前都需要等待,直到计算或处理任务结束了之后才能够继续。 Oozie
可以通过两种不同的方式来检测计算或处理任务是否完成,也就是回调和轮询。当 Oozie
启动了计算或处理任务的时候,它会为任务提供唯一的回调 URL,然后任务会在完成的
时候发送通知给特定的 URL。在任务无法触发回调 URL 的情况下(可能是因为任何原因,
比方说网络闪断),或者当任务的类型无法在完成时触发回调 URL 的时候,Oozie 有一种
机制,可以对计算或处理任务进行轮询,从而保证能够完成任务。
  Oozie 工作流可以参数化(在工作流定义中使用像${inputDir}之类的变量)。在提交工作
流操作的时候,我们必须提供参数值。如果经过合适地参数化(比方说,使用不同的输出
目录),那么多个同样的工作流操作可以并发。
  一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段
和(或)数据可用性和(或)外部事件来运行它们。Oozie 协调系统(Coordinator system)让用户
可以基于这些参数来定义工作流执行计划。Oozie 协调程序让我们可以以谓词的方式对工