自定義實現(xiàn)wordcount的workflow
- 在yarn上測試wordcount程序
$ bin/yarn jar /opt/datas/wd.jar mapreduce.WordCount /input /output

15.png
- 生產(chǎn)一個應(yīng)用目錄,并把wordcount的jar包放到應(yīng)用目錄中的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文件
<workflow-app xmlns="uri:oozie:workflow:0.5" name="map-reduce-wf">
<start to="mr-node"/>
<action name="mr-node">
<map-reduce>
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<!-- 準(zhǔn)備動作,如果輸出路徑存在,先進(jìn)行刪除-->
<prepare>
<delete path="${nameNode}/${oozieDataRoot}/${outputDir}"/>
</prepare>
<configuration>
<property>
<name>mapred.job.queue.name</name>
<value>${queueName}</value>
</property>
<!-- set map class and reduce class-->
<property>
<name>mapreduce.job.map.class</name>
<value>mapreduce.WordCount$WordCountMapper</value>
</property>
<property>
<name>mapreduce.job.reduce.class</name>
<value>mapreduce.WordCount$WordCountReducer</value>
</property>
<!-- set inputdir and outputdir-->
<property>
<name>mapreduce.input.fileinputformat.inputdir</name>
<value>${nameNode}/${oozieDataRoot}/${inputDir}</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.outputdir</name>
<value>${nameNode}/${oozieDataRoot}/${outputDir}</value>
</property>
<!-- 因為oozie會默認(rèn)使用mapreduce1的api,這里需要設(shè)置為mapreduce新的api-->
<property>
<name>mapred.mapper.new-api</name>
<value>true</value>
</property>
<property>
<name>mapred.reducer.new-api</name>
<value>true</value>
</property>
<!-- set map output key and value class-->
<property>
<name>mapreduce.map.output.key.class</name>
<value>org.apache.hadoop.io.Text</value>
</property>
<property>
<name>mapreduce.map.output.value.class</name>
<value>org.apache.hadoop.io.LongWritable</value>
</property>
<!-- set reduceoutput key and value class-->
<property>
<name>mapreduce.job.output.key.class</name>
<value>org.apache.hadoop.io.Text</value>
</property>
<property>
<name>mapreduce.job.output.value.class</name>
<value>org.apache.hadoop.io.IntWritable</value>
</property>
</configuration>
</map-reduce>
<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>
- 在hdfs上創(chuàng)建目錄,并上傳input數(shù)據(jù)
$ 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
-
查看測試結(jié)果
yarn任務(wù)執(zhí)行界面
16.png
oozie的web界面
17.png
輸出文件目錄
18.png
自定義實現(xiàn)WorkFlow中shell action
- 拷貝默認(rèn)的shell目錄來進(jìn)行修改
$ 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
<workflow-app xmlns="uri:oozie:workflow:0.4" name="shell-wf">
<start to="shell-node"/>
<action name="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>${EXEC}</exec>
<!-- 定義shell腳本路勁 -->
<file>${nameNode}/${examplesRoot}/${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current working directory -->
</shell>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>
-
定義要實現(xiàn)的腳本
19.png -
上傳到hdfs后運行
20.png -
查看運行結(jié)果
21.png
22.png
Oozie coordinator調(diào)度
當(dāng)有一個復(fù)雜的工作流job,希望每天定時執(zhí)行,使用crontab方式調(diào)用需要編寫大量的腳本,還要通過大量的判斷來控制每個工作流job的執(zhí)行順序問題。Oozie中的Coordinator可以讓每個工作流workflow當(dāng)做一個動作來運行,這樣就可以將多個job組織起來,并制定觸發(fā)時間和頻率。它的調(diào)度方式有兩種:一種是基于時間調(diào)度;還有一種是基于數(shù)據(jù)可用性調(diào)度(判斷數(shù)據(jù)是否存在和是否符合標(biāo)準(zhǔn))。
-
如果要設(shè)置基于時間的調(diào)度,需要先配置時區(qū),因為oozie默認(rèn)使用的是UTC時區(qū),服務(wù)器默認(rèn)使用的是CST,我們把他們修改為GMT +0800(當(dāng)然也可以是其他時區(qū))
查看系統(tǒng)當(dāng)前時區(qū):
23.png
如果輸出的時區(qū)不是+0800,需要進(jìn)行修改
$ rm -rf /etc/localtime
$ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
修改oozie時區(qū),在oozie-sitexml添加參數(shù)
<property>
<name>oozie.processing.timezone</name>
<value>GMT+0800</value>
</property>
修改oozie/-server/webapps/oozie/oozie-console.js中的時區(qū)設(shè)置,不然會影響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,讓這個任務(wù)從開始時間到結(jié)束時間內(nèi)每分鐘執(zhí)行一次
<coordinator-app name="cron-coord" frequency="${coord:minutes(1)}" 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>
-
oozie的默認(rèn)配置中,至少為每5分鐘執(zhí)行一次,所以需要修改默認(rèn)配置
24.png -
上傳至hdfs后執(zhí)行
25.png -
查看執(zhí)行結(jié)果
27.png
26.png











