一、Oozie 简介
Oozie 英文翻译为:驯象人。一个基于工作流引擎的开源框架,由Cloudera 公司贡献给
Apache,提供对Hadoop Mapreduce、Pig Jobs 的任务调度与协调。Oozie 需要部署到Java
Servlet 容器中运行。主要用于定时调度任务,多任务可以按照执行的逻辑顺序调度。
二、Oozie的功能模块介绍
2.1、模块
1) Workflow
顺序执行流程节点,支持fork(分支多个节点),join(合并多个节点为一个)
2) Coordinator
定时触发workflow
3) Bundle Job
绑定多个Coordinator
2.2、常用节点
1) 控制流节点(Control Flow Nodes)
控制流节点一般都是定义在工作流开始或者结束的位置,比如start,end,kill 等。以及提供工
作流的执行路径机制,如decision,fork,join 等。
2) 动作节点(Action Nodes)
负责执行具体动作的节点,比如:拷贝文件,执行某个Shell 脚本等等。
1前提 :安装好 coluder Manager 见 cdh平台文档
2添加ooze 服务
1调度shell 脚本
$ vi oozie-apps/shell/p1.sh
内容如下:
#!/bin/bash
/sbin/ifconfig > /tmp/p1.log
修改job.properties 和workflow.xml 文件注意文件的名字不可以改动
job.properties
#HDFS 地址
nameNode=hdfs://linux01:8020
#ResourceManager 地址
jobTracker=linux02:8032
#队列名称
queueName=default
examplesRoot=oozie-apps
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell
EXEC=p1.sh
workflow.xml
<?xml version="1.0" encoding="utf-8"?>
<!--name标识这个节点-->
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<!--actionName标识当前需要运行的节点-->
<action name="shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<!--${jobTracker} ${nameNode}表示的是job。Properties的配置中的内容 -->
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<!-对应job properties 中的配置内容 -->
<exec>${EXEC}</exec>
<!-- <argument>my_output=Hello Oozie</argument> --> <!-对应的是hdfs 上的文件位置 #${EXEC} 是固定写法-->
<file>/user/admin/oozie-apps/shell/${EXEC}#${EXEC}</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<decision name="check-output">
<switch>
<case to="end">${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}</case>
<default to="fail-output"/>
</switch>
</decision>
<kill name="fail">
<message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
<message>Incorrect output, expected [Hello Oozie] but was [${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>
2
把该文件上传到hdfs上对应的位置 job.Properties对应的位置
hadoop fs -put [所有文件 p1.sh job.Properties workflow.xml] [job.Properties对应的位置 oozie.wf.application.path实际制定的位置 ]
3执行oozie 服务
命令如下
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
解释
http://z:11000oozie部署的服务器地址
oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
4结束任务
oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W
解释 0000004-170425105153692-oozie-z-W
Oozie启动后会产生的服务标识
2调度多个任务
编写脚本p1.sh
#!/bin/bash
/sbin/ifconfig > /tmp/p1.log
P2.sh
#!/bin/bash
/sbin/ifconfig > /tmp/p2 .log
Job.properties
nameNode=hdfs://z101:8020
jobTracker=z102:8032
queueName=default
examplesRoot=oozie-apps
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/shell
EXEC1=p1.sh
EXEC2=p2.sh
Workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="p1-shell-node"/>
<action name="p1-shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>${EXEC1}</exec>
<file>/user/admin/oozie-apps/shell/${EXEC1}#${EXEC1}</file>
<!-- <argument>my_output=Hello Oozie</argument>-->
<capture-output/>
</shell>
如果成功 执行下一个脚本 如果失败 不执行
<ok to="p2-shell-node"/>
<error to="fail"/>
</action>
<action name="p2-shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>${EXEC2}</exec>
<file>/user/admin/oozie-apps/shell/${EXEC2}#${EXEC2}</file>
<!-- <argument>my_output=Hello Oozie</argument>-->
<capture-output/>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<decision name="check-output">
<switch>
<case to="end">
${wf:actionData('shell-node')['my_output'] eq 'Hello Oozie'}
</case>
<default to="fail-output"/>
</switch>
</decision>
<kill name="fail">
<message>Shell action failed, error
message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
2
把该文件上传到hdfs上对应的位置 job.Properties对应的位置
hadoop fs -put [所有文件 p1.sh job.Properties workflow.xml] [job.Properties对应的位置 oozie.wf.application.path实际制定的位置 ]
3执行oozie 服务
命令如下
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
解释
http://z:11000oozie部署的服务器地址
oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
4结束任务
oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W
解释 0000004-170425105153692-oozie-z-W
Oozie启动后会产生的服务标识
3定时调度任务
前提同步服务器时间
检查系统当前时区:
# date -R
注意这里,如果显示的时区不是+0800,你可以删除localtime 文件夹后,再关联一个正确时
区的链接过去,命令如下
# rm -rf /etc/localtime
# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
同步时间
# ntpdate pool.ntp.org
修改NTP 配置文件:
# vi /etc/ntp.conf
去掉下面这行前面的# ,并把网段修改成自己的网段:
restrict 192.168.122.0 mask 255.255.255.0 nomodify notrap
注释掉以下几行:
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
把下面两行前面的#号去掉,如果没有这两行内容,需要手动添加
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
重启NTP 服务:
# systemctl start ntpd.service,
注意,如果是 centOS7 以下的版本,使用命令:service ntpd start
# systemctl enable ntpd.service,
注意,如果是 centOS7 以下的版本,使用命令:chkconfig ntpd on
集群其他节点去同步这台时间服务器时间:
首先需要关闭这两台计算机的 ntp 服务
# systemctl stop ntpd.service,
centOS7 以下,则:service ntpd stop
# systemctl disable ntpd.service,
centOS7 以下,则:chkconfig ntpd off
# systemctl status ntpd,查看 ntp 服务状态
# pgrep ntpd,查看 ntp 服务进程 id
同步第一台服务器 linux01 的时间:
# ntpdate linux01
制定周期时间
# crontab -e
*/10 * * * * /usr/sbin/ntpdate linux01
重启定时服务即可
# systemctl restart crond.service,
centOS7 以下使用:service crond restart,
编写脚本p1.sh
#!/bin/bash
/sbin/ifconfig >> /tmp/p1.log
Job.properties
nameNode=hdfs://linux01:8020
jobTracker=linux02:8032
queueName=default
examplesRoot=oozie-apps
oozie.coord.application.path=${nameNode}/user/${user.name}/${examplesRoot}/cron
#start:必须设置为未来时间,否则任务失败
start=2017-07-29T17:00+0800
end=2017-07-30T17:00+0800
workflowAppUri=${nameNode}/user/${user.name}/${examplesRoot}/cron
EXEC1=p1.sh
EXEC2=p2.sh
coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(5)}" start="${start}"
end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.2">
<action>
<workflow>
<app-path>${workflowAppUri}</app-path>
<configuration>
<property>
<name>jobTracker</name>
<value>${jobTracker}</value>
</property>
<property>
<name>nameNode</name>
<value>${nameNode}</value>
</property>
<property>
<name>queueName</name>
<value>${queueName}</value>
</property>
</configuration>
</workflow>
</action>
</coordinator-app>
workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.5" name="one-op-wf">
<start to="p3-shell-node"/>
<action name="p3-shell-node">
<shell xmlns="uri:oozie:shell-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
</configuration>
<exec>${EXEC3}</exec>
<file>/user/admin/oozie-apps/cron/${EXEC3}#${EXEC3}</file>
<!-- <argument>my_output=Hello Oozie</argument>-->
<capture-output/>
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Shell action failed, error
message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<kill name="fail-output">
<message>Incorrect output, expected [Hello Oozie] but was
[${wf:actionData('shell-node')['my_output']}]</message>
</kill>
<end name="end"/>
</workflow-app>
2
把该文件上传到hdfs上对应的位置 job.Properties对应的位置
hadoop fs -put [所有文件 p1.sh job.Properties workflow.xml] [job.Properties对应的位置 oozie.wf.application.path实际制定的位置 ]
3执行oozie 服务
注意定时任务需要修改配置如下
增加属性和属性值如下
属性:oozie.processing.timezone
属性值:GMT+0800
解释:修改时区为东八区区时
命令如下
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
解释
http://z:11000oozie部署的服务器地址
oozie-apps/shell/job.properties配置文件在服务器的地址注意并不是hdfs上的地址
oozie job -oozie http://z:11000/oozie -config oozie-apps/shell/job.properties -run
4结束任务
oozie job -oozie http://linux01:11000/oozie -kill 0000004-170425105153692-oozie-z-W
解释 0000004-170425105153692-oozie-z-W
Oozie启动后会产生的服务标识
注意oozie执行周期的最小单位 是5 分钟 低于五分钟 执行失败
[if !supportLists]1) [endif]授权配置如下标识所有用户使用root用户 密码123456来登陆
grant all on *.* to root@'%' identified by '123456';
flush privileges;
刷新配置
2) workflow.xml 配置的时候不要忽略file 属性
3) jps 查看进程时,注意有没有bootstrap
4) 关闭oozie
如果bin/oozied.sh stop 无法关闭,则可以使用kill -9 [pid],之后oozie 根目录下的
oozie-server/temp/xxx.pid 文件一定要删除。
5) Oozie 重新打包时,一定要注意先关闭进程,删除对应文件夹下面的pid 文件。(可以参
考第4 条目)
6) 配置文件一定要生效
起始标签和结束标签无对应则不生效,配置文件的属性写错了,那么则执行默认的属性。
7) libext 下边的jar 存放于某个文件夹中,导致share/lib 创建不成功。
8) 调度任务时,找不到指定的脚本,可能是oozie-site.xml 里面的Hadoop 配置文件没有关
联上。
9) 修改Hadoop 配置文件,需要重启集群。一定要记得scp 到其他节点。
10) JobHistoryServer 必须开启,集群要重启的。
11) Mysql 配置如果没有生效的话,默认使用derby 数据库。
12) 在本地修改完成的job 配置,必须重新上传到HDFS。
13) 将HDFS 中上传的oozie 配置文件下载下来查看是否有错误。
14) Linux 用户名和Hadoop 的用户名不一致。
15)sharelib 找不到,包括重新初始化oozie
如果部署oozie 出错,修复执行,初始化oozie:
1、停止oozie(要通过jps 检查bootstrap 进程是否已经不存在)
2、删除oozie-server/temp/*
3、删除HDFS 上的sharelib 文件夹
4、删除oozie.sql 文件,删除Mysql 中删除oozie 库,重新创建
5、重新按照顺序执行文档中“初始化oozie"这个步骤
六利用hue调度oozie 任务
在action下创建 workflow,在创建scheduler,在创建bundle