工作流引擎Oozie(一):workflow
1. Oozie简介
Yahoo开发工作流引擎Oozie(驭象者),用于管理Hadoop任务(支持MapReduce、Spark、Pig、Hive),把这些任务以DAG(有向无环图)方式串接起来。Oozie任务流包括:coordinator、workflow;workflow描述任务执行顺序的DAG,而coordinator则用于定时任务触发,相当于workflow的定时管理器,其触发条件包括两类:
- 数据文件生成
- 时间条件
Oozie定义了一种基于XML的hPDL (Hadoop Process Definition Language)来描述workflow的DAG。在workflow中定义了
- 控制流节点(Control Flow Nodes)
- 动作节点(Action Nodes)
其中,控制流节点定义了流程的开始和结束(start、end),以及控制流程的执行路径(Execution Path),如decision、fork、join等;而动作节点包括Hadoop任务、SSH、HTTP、eMail和Oozie子流程等。控制流节点示例如下:
<workflow-app xmlns='uri:oozie:workflow:0.2' name="ooziedemo-wf"><start to="timeCheck"/>...<kill name="fail"><message>Failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message></kill><end name="end"/>
</workflow-app><!-- or -->
<workflow-app xmlns='uri:oozie:workflow:0.2' name="ooziedemo-wf"><start ../><fork name="forking"><path start="sqoopMerge1"/><path start="sqoopMerge2"/></fork><join name="joining" to="end"/><end ../>
</workflow-app>
其中,fork、join是成对出现,表示了工作流的并发执行,最后汇聚到一个node。从Oozie的工作流调度机制可以看出,Oozie没有能力表达复杂的DAG,比如:嵌套的依赖关系。此外,Oozie工作流可以参数化,比如:在工作流定义中使用像${inputDir}之类的变量,然后通过job.properties配置对应参数,在启动时将这些配置参数传入工作流:
oozie job -oozie http://<host>:11000/oozie/ -config job.properties -run
2. Workflow
Action Node定义了基本的工作任务节点。(以下介绍版本基于Oozie 4.1.0)
MapReduce
一般地,我用java action启动MapReduce任务,对于任务的动态变化参数,在workflow的configuration进行配置,然后在job.properties指定参数值。
<action name="Data Clean"><java><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.reduce.tasks</name><value>${reducerNum}</value></property><property><name>mapreduce.job.queuename</name><value>${queueName}</value></property> </configuration><main-class>...</main-class><java-opts>-Xms256m -Xmx512m</java-opts><arg>..</arg><arg>${nameNode}/user/${wf:user()}/xx</arg>...<arg>${cleanDate}</arg><capture-output /></java><ok to="end" /><error to="fail" />
</action>
其中, ${wf:user()}
为workflow的内置参数,表示当前用户名。一般地,使用该参数,为了保证写权限(毕竟没有写文件到其他用户文件夹的权限)。
Spark
Oozie支持Spark action,不过支持的不是特别好。提交spark任务时,需要加载spark-assembly jar。
<action name="Spark Data Clean"><spark xmlns="uri:oozie:spark-action:0.1"><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapred.job.queue.name</name><value>${queueName}</value></property></configuration><master>yarn-cluster</master><mode>cluster</mode><name>etl${cleanDate}</name><class>...</class><jar>/<hdfs>/<path>/lib/xxx.jar</jar><spark-opts>--num-executors ${executors} --driver-memory 4g --executor-memory 4g --executor-cores 5 --queue=${queueName}</spark-opts><arg>..</arg></spark><ok to="end" /><error to="fail" />
</action>
Pig
Oozie内置pig action,其中<script>
为pig脚本所在的HDFS路径,param
为pig脚本中的参数。Oozie调度pig任务略坑,先随机指定一台机器,然后将pig脚本dist到该机器,然后执行。但是,因为集群中不同机器部署的pig版本可能不一致,而导致任务跑失败。
<action name="Pig Data Clean"><pig><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapreduce.job.queuename</name><value>${queueName}</value></property></configuration><script>/<hdfs>/<path>/data-clean.pig</script><param>CLEANDATE=${cleanDate}</param></pig><ok to="end"/><error to="fail"/>
</action>
在pig脚本中,一般用$
+ 大写字母表示输入参数,示例如下:
A = load '/<hdfs>/<path>/$CLEANDATE' using OrcStorage();
...
E = ...
store E into '/<path>/$CLEANDATE';
实际上,在本地执行带参数的pig脚本时,也是用-param命令:
pig -f test.pig -param CLEANDATE=2016-05-26
Hive
Oozie也可以调度Hive任务,一般使用hive2 action通过beeline连接Hive Server 2,然后执行HiveQL:
<action name="Hive2"><hive2 xmlns="uri:oozie:hive2-action:0.1"><job-tracker>${jobTracker}</job-tracker><name-node>${nameNode}</name-node><configuration><property><name>mapreduce.job.queuename</name><value>${queueName}</value></property></configuration><jdbc-url>jdbc:hive2://host:10000/db-name</jdbc-url><script>${NameNode}/<hdfs>/<path>/test.hql</script><param>DAYTIME=${dayTime}</param></hive2><ok to="end"/><error to="fail"/>
</action>
其中,param为HiveQL中的输入参数,其对应hql为
alter table db.log_tb
add if not exists partition (day_time=date '${DAYTIME}')
location '${DAYTIME}';
hive命令执行本地hql通过--hivevar
传入参数:
hive -f test.hql --hivevar DAYTIME=2016-05-17
此外,在执行hive2 action时需有如下依赖:
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>${hive.version}</version>
</dependency>
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-beeline</artifactId><version>${hive.version}</version>
</dependency>
在job.properties指定oozie.libpath
(对应于依赖jar的目录)。
工作流引擎Oozie(一):workflow相关推荐
- asp.net强大工作流引擎,learun助力开发升级
现在,办公要流程化,营销也有流程,流程现在已经是各种生活活动不可缺少的一部分了.就像这句耳熟能详的话:"凡事,我们先走个流程嘛!" 在信息化.流程化的背景下. 工作流引擎 ,这个名 ...
- 共有90款 工作流引擎开源软件
共有90款 工作流引擎开源软件,第1页 java工作流引擎,开源工作流引擎,工作流引擎是什么,工作流引擎设计,工作流引擎介绍,.net工作流引擎,工作流引擎比较,工作流引擎内核揭秘,.net开源工作流 ...
- 可自管理的分布式工作流引擎的设计与实现
<script type="text/javascript"></script> <script src="http://pagead2.g ...
- 工作流系列之可自管理的分布式工作流引擎的设计与实现
这篇文章是偶在清华读研究生时发表在国家核心期刊CIMS("Design and implementation of self-managed distributed workflow eng ...
- python工作流引擎workflow.py_什么是工作流引擎
工作流引擎,是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色.分工和条件的不同决定信息传递路由.内容等级等核心解决方案. 以前一直在想如何构建一个灵活的OA工作流机 ...
- 工作流引擎--swamp
什么是工作流引擎(Workflow Engine ) 例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性.易维护性 ...
- 驰骋工作流引擎设计系列07 线性流程节点运动(发送)设计
第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow 第1节. 线性流程节点运动(发送)设计 发送就是从一个节点发送到另外一个节点,也可以说从一个节点运动到另 ...
- 驰骋工作流引擎的流程属性-节点属性-前台操作
1: 工作流引擎功能-流程属性 • 支持客户参与流程:比如在一个erp系统里供应商相对企业来说是外部用户,在一个学校系统里,教师是内部用户,学生是外部用户.ccflow支持外部用户登录参与 ...
- 工作流引擎在视频网站架构中的应用
如果对工作流引擎没有了解过的同学可以先看前一篇文章: 土制状态机在工作流引擎中的应用 http://ahuaxuan.iteye.com/blog/505124 /** * @author: ahua ...
最新文章
- 中小型互联网公司微服务实践-经验和教训
- 并联串联混合的电压和电流_串、并联电路中的电流与电压规律
- Ruby入门之零基础如何学ruby以及ruby的应用/快速学习ruby/学习ruby的流程是什么?...
- 【Python】实现输出成绩最高或最低分的学生姓名以及低于平均分的学生姓名
- springboot链接数据库的bug
- 咨询的真相5:咨询业的“前世今生”
- 理解:回归与拟合、归一化与标准化
- 【GNN框架系列】DGL第二讲:使用Deep Graph Library实现GNN进行链接预测
- 小程序页面转pdf时如何实现自动分页
- BI系统打包Docker镜像及容器化部署的具体实现
- 数据库中外连接的三种形式(左连接,右连接,全连接)
- ArcGIS 矢量编辑札记(一):Field Calculator 篇
- Python开发高频英语单词700+,熟悉后英文障碍又少了
- CCF201809-4 再卖菜
- 拒绝烂图表,Excel商务图表小白篇
- 计算机信息系统安全管理的主要原则有哪些,网络系统安全性设计原则有哪些
- 【认识硬件】之 水泥电阻
- 数据解惑 · 带你认识数字高程模型(DEM)
- cin、cout、cerr、clog用法区别及其在VS环境下的重定向
- mysql列插入数据
热门文章
- 基于jquery的无刷新表格分页
- 病毒周报(100719至100725)
- page_index--template.html(0)源码
- 多看系统下载_漫画迷手机必备,「漫画之家」全网漫画随意看
- copy,mutableCopy,retain区别
- Nessus提示API Disabled错误
- XamarinEssentials教程设置首选项Preferences的值
- 获取AFP共享的文件夹及其权限
- sqlalchemy mysql_SQLAlchemy简明教程
- 三菱伺服电机选型手册_PLC触摸屏控制伺服电机程序设计