为什么要有Oozie?
在数据业务场景,对于数据的处理往往是分阶段处理,而不同的阶段可能采用了不同的技术框架去完成这个业务需求,且可能在不同的阶段要干不同的事。
炒饭(锅) à 吃饭(碗) à 筷子(动手)
要吃饭就要等炒饭先用锅炒好,要用筷子动手吃饭就要等碗里装了饭,这是一个流水线式的过程,如果用设定时间的方式,到了什么时候就拿完去装饭,但如果今天兼职的人特别多,那么炒的饭必然就多了,时间也长了,但是设定时间到了,还没炒好,可是有一堆人挤在厨房喊要饭,问题就出现了。
于是有的人会想,如果有一个监督人帮我去这个监控、通知、控制好整个流程,那样多好啊,厨房就不会给天天催了,也不会发生拥挤的情况。
小结:一个完整的数据分析系统通常是由大量的任务单元组成,Shell脚本、Java程序、MapReduce程序、Hive脚本等等,各个任务单元之间存在时间先后及前后依赖关系。
为了很好的组织这样的复杂执行计划,需要一个工作流调度系统来调用执行。
简单的工作流调度:Liunx的crontab来定义
复杂的工作流调度:Oozie、Azakaban等。。。
主流几款工作流调度框架
特性HamakeOozieAzkabanCascading
工作流描述语言XMLXML (xPDL based)text file with key/value pairsJava API
依赖机制data-drivenexplicitexplicitexplicit
是否要web容器NoYesYesNo
进度跟踪console/log messagesweb pageweb pageJava API
Hadoop job调度支持noyesyesyes
运行模式command line utilitydaemondaemonAPI
Pig支持yesyesyesyes
事件通知nononoyes
需要安装noyesyesno
支持的hadoop版本0.18+0.20+currently unknown0.18+
重试支持noworkflownode evelyesyes
运行任意命令yesyesyesyes
Amazon EMR支持yesnocurrently unknownyes
什么是Oozie?
Oozie(驯象人)是一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache的,用在一个工作流内以一个特定顺序运行一组工作或流程。
Oozie在集群中扮演的是定时调度任务,多任务,并开源按照业务逻辑顺序调度。
组成
Workflow:顺序执行流程节点,执行分支多节点或合并多分点为一个分支。
Coordinator:定时触发Workflow
BundleJob:绑定多个Coordinator
Oozie节点
控制流节点(Control Flow Nodes):一般都是定义在工作流开始或结束,比如start、end、kill等,以及提供工作流的执行路径。
动作节点(Action Nodes):执行具体动作的节点。
案例
job.properties
#NameNode地址
nameNode=hdfs://hadoop-senior00-levi.com:8082
#ResourceManager地址,默认端口8032
jobTracker=hadoop-senior00-levi.com:8032
#内部的Event队列名称
queueName=default
examplesRoot=oozie-apps
#程序位置
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell
#执行这个脚本
EXEC1=test1.sh
EXEC2=test2.sh
workflow.xml
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${EXEC1}
/user/admin/oozie-apps/shell/${EXEC1}#${EXEC1}
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${EXEC2}
/user/admin/oozie-apps/shell/${EXEC2}#${EXEC2}
${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
Shell action failed, errormessage[${wf:errorMessage(wf:lastErrorNode())}]
Incorrect output, expected [Hello Oozie] but was[${wf:actionData('shell-node')['my_output']}]
test1.sh
#!/bin/bash
/usr/bin/date > /tmp/test.log
/usr/bin/date > /tmp/test.log
执行:
上传到HDFS:
hdfs dfs -rmr /user/levi/oozie-apps
hdfs dfs -put oozie-apps/ /user/levi
执行任务:
bin/oozie job --ooziehttp://hadoop-senior00-levi.com:11000/oozie -config oozie-apps/shell/job.properties-run
使用注意事项
[if !supportLists]1. [endif]启动不了,则到oozie-server/temp查看是否有*.pid文件,有就删除后在启动。
[if !supportLists]2. [endif]如果无法关闭oozie则kill掉。
[if !supportLists]3. [endif]Mysql配置如果没有生效的话,默认使用derby数据库
[if !supportLists]4. [endif]在本地修改完成的job配置,必须重新上传到HDFS。
[if !supportLists]5. [endif]Linux用户名和Hadoop的用户名不一致。
[if !supportLists]6. [endif]时区