本文是在学习oozie时看到的一篇不错的文章,转自博客园-xingoo的一篇文章。致谢原作者。
一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多,或者多对一,或者条件判断等等。Oozie在这方面支持的很好,它把节点分为控制节点和操作节点两种类型,控制节点用于控制工作流的计算流程,操作节点用于封装计算单元。本篇就主要描述下它的控制节点...
背景
先看看oozie工作流里面的几个定义:
- action,一个action是一个独立的任务,比如mapreduce,pig,shell,sqoop,spark或者java程序,它也可能是引用了某个action节点。
- workflow,它是一组action的集合,内部控制了节点间的依赖关系,DAG(Direct Acyclic Graph),一个action依赖另一个action,就意味着只有前一个action运行完成,才能继续运行下一个。
- worklfow definition,是可执行的workflow的描述
- workflow definition language,定义了workflow的语言
- workflow job,是一个workflow的实例
- workflow engine,用来执行workflow的系统
在oozie里面,工作流就是一组操作的集合,他们之前包含了前后依赖的关系,比如hadoop,pig等等。工作流里面可以包含fork和join的节点,用于把任务水平拆分成多个,并行执行,然后再合并到一起。
在oozie中,工作流的状态可以是:
PREP | RUNNING | SUSPENDED | SUCCEEDED | KILLED | FAILED |
---|
当任务失败时,oozie会通过参数控制进行重试,或者直接退出。
工作流定义
一个工作流的定义包含了 流控制节点(比如start,end,decision,fork,join,kill)以及action节点(比如map-reduce,spark,sqoop,java,shell等),节点直接都是通过有向箭头相连。
注意:在oozie里面是不支持环路的,工作流必须是严格的单向DAG。
工作流节点
工作流节点的命名规则需要满足=[a-zA-Z][\-_a-zA-Z0-0]*=
,并且长度在20个字符以内。
流控制节点
流控制节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill等。以及提供工作流的执行路径机制,如decision,fork,join等。
start
start节点是工作流的入口,workflow第一个action就需要是start。当工作流启动后,会自动寻找start节点执行。每个工作流都需要有一个start节点。
例如:
<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
...
<start to="firstHadoopJob"/>
...
</workflow-app>