简介
- Oozie 是用于 Hadoop 平台的开源的工作流调度引擎。
- 用于管理 Hadoop
- 属于web应用程序, 由 Oozie client 和 Oozie Server 两个组件构成。
- Oozie Server 运行于 Java Servlet容器 (Tomcat) 中的 web 程序。
作用
- 统一调度hadoop系统中场景的MR任务启动、hdfs操作、shell调度、hive操作等
- 使得复杂的依赖关系、时间触发、事件触发使用xml语言进行表达, 开发效率提高
- 一组任务使用一个DAG来表示, 使用图形表达流程逻辑更加清晰
- 支持很多种任务调度, 能完成大部分 hadoop 任务处理
- 程序定义支持 EL 常量 和 函数, 表达更加丰富
Oozie 架构
安装方式
- 手动安装
- Cloudera Manger 添加服务
Oozie Web控制台
- 解压ext-x.x到/var/lib/oozie目录下 unzip ext-x.x.zip -d /var/lib/oozie/
- Oozie服务中配置启用web控制台
- 保存,重启oozie服务
Oozie 配置
- 节点内存配置
- oozie.service.callablequeueservice.callable.concurrency(节点并发)
- oozie.service.callablequeueservice.queue.size(队列大小)
- oozie.service.ActionService.executor.ext.classes(扩展)
Oozie 共享库
- /user/oozie/share/lib(hdfs中目录)
web管理地址
- http://oozie_host_ip:11000/oozie/
Oozie 管理
- 任务列表查看
- 任务状态查看
- 流程返回信息
- 节点信息查看
- 流程图信息
- 日志查看
- 系统信息查看 和 配置
Oozie CLI 命令
- 启动任务
- oozie job -oozie http://ip:11000/oozie/ -config job.properties -run
- 停止任务
- oozie job -oozie http://ip:11000/oozie/ -kill 0000002-150713234209387-oozie-oozi-W
- 提交任务
- oozie job -oozie http://ip:11000/oozie/ -kill 0000002-150713234209387-oozie-oozi-W
- 开始任务
- oozie job -oozie http://ip:11000/oozie/ -config job.properties -start 0000003-150713234209387-oozie-oozi-W
- 查看任务执行情况
- oozie job -oozie http://ip:11000/oozie/ -config job.properties -info 0000003-150713234209387-oozie-oozi-W
Job 配置 job.properties
WorkFLow 配置
-
版本信息
- <workflow-app xmlns="uri:oozie:workflow:0.4" name=“workflow name">
-
EL函数
-
基本EL函数
-
String firstNotNull(String value1, String value2)
-
String concat(String s1, String s2)
-
String replaceAll(String src, String regex, String replacement)
-
String appendAll(String src, String append, String delimeter)
-
String trim(String s)
-
String urlEncode(String s)
-
String timestamp()
-
String toJsonStr(Map) (since Oozie 3.3)
-
String toPropertiesStr(Map) (since Oozie 3.3)
-
String toConfigurationStr(Map) (since Oozie 3.3)
-
-
WorkFlow EL
- String wf:id() – 返回当前workflow作业ID
- String wf:name() – 返回当前workflow作业NAME
- String wf:appPath() – 返回当前workflow的路径
- String wf:conf(String name) – 获取当前workflow的完整配置信息
- String wf:user() – 返回启动当前job的用户
- String wf:callback(String stateVar) – 返回结点的回调URL,其中参数为动作指定的退出状态
- int wf:run() – 返回workflow的运行编号,正常状态为0
- Map wf:actionData(String node) – 返回当前节点完成时输出的信息
- int wf:actionExternalStatus(String node) – 返回当前节点的状态
- String wf:lastErrorNode() – 返回最后一个ERROR状态推出的节点名称
- String wf:errorCode(String node) – 返回指定节点执行job的错误码,没有则返回空
- String wf:errorMessage(String message) – 返回执行节点执行job的错误信息,没有则返回空
-
HDFS EL
- boolean fs:exists(String path)
- boolean fs:isDir(String path)
- long fs:dirSize(String path) – 目录则返回目录下所有文件字节数;否则返回-1
- long fs:fileSize(String path) – 文件则返回文件字节数;否则返回-1
- long fs:blockSize(String path) – 文件则返回文件块的字节数;否则返回-1
-
-
节点
-
流程控制节点
-
流程控制节点
- start – 定义workflow开始
- end – 定义workflow结束
- decision – 实现switch功能
- sub-workflow – 调用子workflow
- kill – 杀死workflow
- fork – 并发执行workflow
- join – 并发执行结束(与fork一起使用)
<decision name="[NODE-NAME]"> <switch> <case to="[NODE_NAME]">[PREDICATE]</case> ... <case to="[NODE_NAME]">[PREDICATE]</case> <default to="[NODE_NAME]" /> </switch> </decision>
-
动作节点
-
shell
-
java
-
fs
-
MR
-
hive
-
sqoop
<fork name="[FORK-NODE-NAME]"> <path start="[NODE-NAME]" /> ... <path start="[NODE-NAME]" /> </fork> ... <join name="[JOIN-NODE-NAME]" to="[NODE-NAME]" />
-
-
-
Shell节点
-
job.properties
nameNode=hdfs://node01:8020 jobTracker=node01:8032 queueName=default examplesRoot=examples oozie.wf.application.path=${nameNode}/user/workflow/oozie/shell
-
workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.3" name="shell-wf"> <start to="shell-node"/> <action name="shell-node"> <shell xmlns="uri:oozie:shell-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> <exec>echo</exec> <argument>hi shell in oozie</argument> </shell> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app>
-
-
调用impala
-
job.properties
nameNode=hdfs://node01:8020 jobTracker=node01:8032 queueName=default examplesRoot=examples oozie.usr.system.libpath=true oozie.libpath=${namenode}/user/${user.name}/workflow/impala/lib oozie.wf.application.path=${nameNode}/user/${user.name}/workflow/impala
-
workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="impala-wf"> <start to="shell-node"/> <action name="shell-node"> <shell xmlns="uri:oozie:shell-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> <exec>impala-shell</exec> <argument>-i</argument> <argument>node02</argument> <argument>-q</argument> <argument>invalidate metadata</argument> <capture-output/> </shell> ...... </action> ....... </workflow-app>
-
-
fs节点
-
workflow.xml
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.5"> ... <action name="[NODE-NAME]"> <fs> <delete path='[PATH]'/> <mkdir path='[PATH]'/> <move source='[SOURCE-PATH]' target='[TARGET-PATH]'/> <chmod path='[PATH]' permissions='[PERMISSIONS]' dir-files='false' /> <touchz path='[PATH]' /> <chgrp path='[PATH]' group='[GROUP]' dir-files='false' /> </fs> <ok to="[NODE-NAME]"/> <error to="[NODE-NAME]"/> </action> </workflow-app>
-
-
Java节点
-
job.properties
nameNode=hdfs://node01:8020 jobTracker=node01:8032 queueName=default examplesRoot=examples oozie.usr.system.libpath=true oozie.libpath=${nameNode}/user/workflow/lib/lib4java oozie.wf.application.path=${nameNode}/user/workflow/oozie/java
-
workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.3" name="mr-wc-wf"> <start to="mr-node"/> <action name="mr-node"> <java> <job-tracker>${jobTracker}</job-tracker> <name-node>${nameNode}</name-node> <prepare> <delete path="${nameNode}/user/path" /> <mkdir path="${nameNode}/user/path" /> </prepare> <configuration> <property> <name>mapred.job.queue.name</name> <value>${queueName}</value> </property> </configuration> <main-class>com.pagename.classname</main-class> <arg>args1</arg> <arg>args2</arg> </java> <ok to="end"/> <error to="fail"/> </action> <kill name="fail"> <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app>
-
-