自定义实现wordcount的workflow
- 在yarn上测试wordcount程序
$ bin/yarn jar /opt/datas/wd.jar mapreduce.WordCount /input /output
- 生产一个应用目录,并把wordcount的jar包放到应用目录中的lib目录下
$ cd /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/
$ mkdir my-apps
$ cp -r examples/apps/map-reduce/ my-apps/
$ cp /opt/datas/wd.jar my-apps/map-reduce/lib/
- 修改job.properties文件
# 定义变量
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
oozieAppsRoot=user/wulei/my-apps
oozieDataRoot=user/wulei/oozie/datas
inputDir=map-reduce/input
outputDir=map-reduce/output
# 定义workflow.xml的路径
oozie.wf.application.path=${nameNode}/${oozieAppsRoot}/map-reduce/workflow.xml
- 修改workflow.xml文件
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
mapreduce.job.map.class
mapreduce.WordCount$WordCountMapper
mapreduce.job.reduce.class
mapreduce.WordCount$WordCountReducer
mapreduce.input.fileinputformat.inputdir
${nameNode}/${oozieDataRoot}/${inputDir}
mapreduce.output.fileoutputformat.outputdir
${nameNode}/${oozieDataRoot}/${outputDir}
mapred.mapper.new-api
true
mapred.reducer.new-api
true
mapreduce.map.output.key.class
org.apache.hadoop.io.Text
mapreduce.map.output.value.class
org.apache.hadoop.io.LongWritable
mapreduce.job.output.key.class
org.apache.hadoop.io.Text
mapreduce.job.output.value.class
org.apache.hadoop.io.IntWritable
Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
- 在hdfs上创建目录,并上传input数据
$ bin/hdfs dfs -mkdir -p /user/wulei/oozie/datas/map-reduce/input
$ bin/hdfs dfs -put -put /opt/datas/a.txt oozie/datas/map-reduce/input
- 上传oozie-apps目录
$ bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/my-apps/ my-apps
- 运行测试
$ bin/oozie job -oozie http://bigdata-00:11000/oozie -config my-apps/map-reduce/job.properties -run
-
查看测试结果
yarn任务执行界面
oozie的web界面
输出文件目录
自定义实现WorkFlow中shell action
- 拷贝默认的shell目录来进行修改
$ cp -r ./examples/apps/shell/ my-apps/
- 定义job.properties
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
examplesRoot=user/wulei/my-apps/shell
#定义workflow.xml路劲
oozie.wf.application.path=${nameNode}/${examplesRoot}/workflow.xml
#定义一个变量名存储shell文件名
EXEC=oozie.sh
- 定义workflow.properties
${jobTracker}
${nameNode}
mapred.job.queue.name
${queueName}
${EXEC}
${nameNode}/${examplesRoot}/${EXEC}#${EXEC}
Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]
-
定义要实现的脚本
-
上传到hdfs后运行
-
查看运行结果
Oozie coordinator调度
当有一个复杂的工作流job,希望每天定时执行,使用crontab方式调用需要编写大量的脚本,还要通过大量的判断来控制每个工作流job的执行顺序问题。Oozie中的Coordinator可以让每个工作流workflow当做一个动作来运行,这样就可以将多个job组织起来,并制定触发时间和频率。它的调度方式有两种:一种是基于时间调度;还有一种是基于数据可用性调度(判断数据是否存在和是否符合标准)。
-
如果要设置基于时间的调度,需要先配置时区,因为oozie默认使用的是UTC时区,服务器默认使用的是CST,我们把他们修改为GMT +0800(当然也可以是其他时区)
查看系统当前时区:
如果输出的时区不是+0800,需要进行修改
$ rm -rf /etc/localtime
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改oozie时区,在oozie-sitexml添加参数
oozie.processing.timezone
GMT+0800
修改oozie/-server/webapps/oozie/oozie-console.js中的时区设置,不然会影响web界面的时间,修改完成后重启生效
function getTimeZone() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
return Ext.state.Manager.get("TimezoneId","GMT+0800");
}
- 拷贝模板中的coordinator案例
$ cp -r examples/apps/cron-schedule/ my-apps/
- 修改job.properties
nameNode=hdfs://bigdata-00:8020
jobTracker=bigdata-00:8032
queueName=default
examplesRoot=user/wulei/my-apps/cron-schedule
# 定义coordinate路径
oozie.coord.application.path=${nameNode}/${examplesRoot}
start=2016-11-13T12:30+0800
end=2016-11-13T13:30+0800
# 定义workflow路劲
workflowAppUri=${nameNode}/${examplesRoot}
- 修改coorndinate.xml,让这个任务从开始时间到结束时间内每分钟执行一次
${workflowAppUri}
jobTracker
${jobTracker}
nameNode
${nameNode}
queueName
${queueName}
-
oozie的默认配置中,至少为每5分钟执行一次,所以需要修改默认配置
-
上传至hdfs后执行
-
查看执行结果