背景:工作初期,目前公司这边是使用crontab做的脚本调度,但是如果某个脚本出问题,一时间很难找到是哪里出问题,维护工作量偏大,所以抽出一点时间来研究下oozie。
什么是oozie?
oozie是一个javaweb程序,它运行在java servlet容器-即tomcat中,并且使用数据库来存储一下内容,1、工作流定义 2、当前运行的工作流实例,包括实例的状态和变量。
oozie工作流是放置在控制依赖DAG 有向无环图 中的一组动作,例如说shell mapreduce 还有一些pig脚本作业等,会按照一定的顺序执行,我们会使用一种HPDL (一种xml流程定义语言)
来描述这个图。
HDPL是一种比较简洁的语言,只会使用少数的流程控制和动作节点,控制节点会定义执行的流程,并包含工作流的起始和结束点 (start end fail) 以及控制工作流执行路径的机制(decision fork以及join节点),
动作节点是一种机制,通过他们工作流会触发执行计算或者处理任务,Oozie为以下类型的动作提供支持: Hadoop map-reduce、Hadoop文件系统、Pig、Java、hive、sqoop、spark、email和Oozie的子工作流
(SSH动作已经从Oozie schema 0.2之后的版本中移除了)等。
所有由动作节点触发的计算或处理,都不在oozie里,而是由mapreduce框架执行,这种方法可以让现有的hadoop用于负载均衡,灾难恢复机制。这些任务主要是异步执行的,当然也有同步执行的(只有文件系统例外)
这就意味着大多数工作流触发到计算或者处理任务的类型来说,在工作流操作转换到下一个流程的时候需要等待。直到上一个流程正常结束后,下一流程才可继续。oozie可以通过两种不同方式来检测计算或者处理任务是否
完成。回调和轮询。当oozie启动了计算或者处理任务的时候,它会为任务提供唯一的回调url,然后任务会在完成的时候发送给指定的url,当任务无法触发回调url时候,oozie特有的机制,可以对计算或者处理任务进行轮询操作,
从而保证完成任务。
Oozie工作流可以参数化(在工作流定义中使用像${inputDir}之类的变量)。在提交工作流操作的时候,我们必须提供参数值。如果经过合适地参数化(比方说,使用不同的输出目录),那么多个同样的工作流操作可以并发。
一些工作流是根据需要触发的,但是大多数情况下,我们有必要基于一定的时间段和(或)数据可用性和(或)外部事件来运行它们。Oozie协调系统(Coordinator system)让用户可以基于这些参数来定义工作流执行计划。
Oozie协调程序让我们可以以谓词的方式对工作流执行触发器进行建模,那可以指向数据、事件和(或)外部事件。工作流作业会在谓词得到满足的时候启动。 经常我们还需要连接定时运行、但时间间隔不同的工作流操作。
多个随后运行的工作流的输出会成为下一个工作流的输入。把这些工作流连接在一起,会让系统把它作为数据应用的管道来引用。Oozie协调程序支持创建这样的数据应用管道。
关于oozie的详细介绍,请戳oozie详情。