Oozie分布式工作流——流控制
最近又开始捅咕上oozie了,所以回头还是翻译一下oozie的文档。文档里面最重要就属这一章了——工作流定义。
一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多,或者多对一,或者条件判断等等。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 jon,是一个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>
end
end节点是工作流执行成功的最后一个节点,当到达end节点后,工作流的状态会变成SUCCEEDED.如果有多个action指向了end,那么当第一个action执行后就会直接跳转到end节点,虽然后面的action都没有执行,但是workflow也认为是成功执行了。
例如:
<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
...
<end name="end"/>
</workflow-app>
kill
kill节点允许工作流自动停止,当工作流执行到kill时,工作流的状态将会被认为是KILLED。如果有一个或者多个节点指向了kill,那么工作流都会被停止。一个workflow可以声明零个或者多个节点。
其中name属性是kill节点的名称,message指定了工作流退出的原因。
<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
...
<kill name="killBecauseNoInput">
<message>Input unavailable</message>
</kill>
...
</workflow-app>
decision
decision节点支持给工作流提供选择,有点类似switch-case的语法。它使用JSP表达式语法,来进行条件判断。
比如:
<workflow-app name="foo-wf" xmlns="uri:oozie:workflow:0.1">
...
<decision name="mydecision">
<switch>
<case to="reconsolidatejob">
${fs:fileSize(secondjobOutputDir) gt 10 * GB}
</case> <case to="rexpandjob">
${fs:fileSize(secondjobOutputDir) lt 100 * MB}
</case>
<case to="recomputejob">
${ hadoop:counters('secondjob')[RECORDS][REDUCE_OUT] lt 1000000 }
</case>
<default to="end"/>
</switch>
</decision>
...
</workflow-app>
fork和join
fork节点把任务切分成多个并行任务,join则合并多个并行任务。fork和join节点必须是成对出现的。join节点合并的任务,必须是通一个fork出来的子任务才行。
<workflow-app name="sample-wf" xmlns="uri:oozie:workflow:0.1">
...
<fork name="forking">
<path start="firstparalleljob"/>
<path start="secondparalleljob"/>
</fork>
<action name="firstparallejob">
<map-reduce>
<job-tracker>foo:8021</job-tracker>
<name-node>bar:8020</name-node>
<job-xml>job1.xml</job-xml>
</map-reduce>
<ok to="joining"/>
<error to="kill"/>
</action>
<action name="secondparalleljob">
<map-reduce>
<job-tracker>foo:8021</job-tracker>
<name-node>bar:8020</name-node>
<job-xml>job2.xml</job-xml>
</map-reduce>
<ok to="joining"/>
<error to="kill"/>
</action>
<join name="joining" to="nextaction"/>
...
</workflow-app>
在oozie里面,这种fork和join的机制是非常有用的,它可以把水平的任务并行执行,这样能更有效的利用集群的资源,避免资源闲置浪费。
如果使用HUE图形化界面的话,这些流控制节点基本上都是自动生成的,用户可以不需要关注。但是为了能看懂实际的任务,最好还是了解一下他们的关系。
Oozie分布式工作流——流控制的更多相关文章
- Oozie分布式工作流——Action节点
前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点.Action节点有一些比较通用的特性: Action节点是远程的 所有oozie创建的计算和处理任务都是异步的, ...
- Oozie分布式工作流——EL表达式
oozie支持使用EL(expression language)表达式. 基本的EL常量 KB MB GB TB PB 基本EL函数 string firstNotNull(String value1 ...
- Oozie分布式工作流——从理论和实践分析使用节点间的参数传递
Oozie支持Java Action,因此可以自定义很多的功能.本篇就从理论和实践两方面介绍下Java Action的妙用,另外还涉及到oozie中action之间的参数传递. 本文大致分为以下几个部 ...
- 分布式工作流任务调度系统Easy Scheduler正式开源
分布式工作流任务调度系统Easy Scheduler正式开源 1.背景 在多位技术小伙伴的努力下,经过近2年的研发迭代.内部业务剥离及重构,也经历一批种子用户试用一段时间后,EasyScheduler ...
- 开源分布式工作流任务调度系统Easy Scheduler Release 1.0.2发布
Easy Scheduler Release 1.0.2===Easy Scheduler 1.0.2是1.x系列中的第三个版本.此版本增加了调度开放接口.worker分组(指定任务运行的机器组).任 ...
- Oozie分布式任务的工作流——邮件篇
在大数据的当下,各种spark和hadoop的框架层出不穷.各种高端的计算框架,分布式任务如乱花般迷眼.你是否有这种困惑!--有了许多的分布式任务,但是每天需要固定时间跑任务,自己写个调度,既不稳定, ...
- Oozie分布式任务的工作流——脚本篇
继前一篇大体上翻译了Email的Action配置,本篇继续看一下Shell的相关配置. Shell Action Shell Action可以执行Shell脚本命令,工作流会等到shell完全执行完毕 ...
- Oozie分布式任务的工作流——Spark篇
Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark.在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任务,合理的设计工作流并分配适合的参数对于 ...
- Oozie分布式任务的工作流——Sqoop篇
Sqoop的使用应该是Oozie里面最常用的了,因为很多BI数据分析都是基于业务数据库来做的,因此需要把mysql或者oracle的数据导入到hdfs中再利用mapreduce或者spark进行ETL ...
随机推荐
- nagios系列(八)之nagios通过nsclient监控windows主机
nagios通过nsclient监控windows主机 1.下载NSClient -0.3.8-Win32.rar安装在需要被监控的windows主机中 可以设置密码,此处密码留空 2.通过在nagi ...
- CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
Linux HA Cluster高可用服务器集群,所谓的高可用不是主机的高可用,而是服务的高可用. 什么叫高可用:一个服务器down掉的可能性多种多样,任何一个可能坏了都有可能带来风险,而服务器离线通 ...
- Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 inconsistent binding
1.发生原因 springAOP 里面绑定参数出现错误 核对绑定参数的名称 核对 springAOP的版本 2.aop切面表达式写的有误
- javascript 类型比较方法
不要使用new Number().new Boolean().new String()创建包装对象: 用parseInt()或parseFloat()来转换任意类型到number: 用String() ...
- 【Android开源库】美团等APP城市选择
CityPicker 现在使用比较多的类似美团等APP的城市选择界面. 2步即可实现,就是这么简单粗暴! Gif image APK 下载demo.apk体验. Install Gradle: com ...
- ASP.NET Global.asax详解【转】
global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件也被称为应用程序文件. global.asax 文件中的任何代码都是 ...
- 使用gunicorn将django项目部署到生产环境的子目录下,在nginx后端获取客户真实IP地址
生产环境有时,并不是为了一个项目而存在的.毕竟,域名是比较稀有的. 今天遇到这个问题,解决了.作个记录. 并且,如果将django项目部署在Nginx后面,那如何获取用户真实的IP地址呢? 下面就来解 ...
- [转] 理解Web路由
1. 什么是路由 在Web开发过程中,经常会遇到『路由』的概念.那么,到底什么是路由?简单来说,路由就是URL到函数的映射. 2. router和route的区别 route就是一条路由,它将一个UR ...
- POJ - 1266 -
题目大意:给出一条圆弧上的两个端点A,B,和圆弧上两端点之间的一个点C,现在要用一块各个定点的坐标均为整数的矩形去覆盖这个圆弧,要求最小的矩形面积. 思路:叉积在本体发挥很强大的作用.首先求出三个点所 ...
- hdu1576(扩展欧几里得)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目:要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能 ...