Oozie的workflow和coordinate的使用

自定義實現(xiàn)wordcount的workflow

  1. 在yarn上測試wordcount程序
$ bin/yarn jar /opt/datas/wd.jar mapreduce.WordCount /input /output
15.png
  1. 生產(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/
  1. 修改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
  1. 修改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>
  1. 在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
  1. 上傳oozie-apps目錄
$ bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/my-apps/ my-apps
  1. 運行測試
$ bin/oozie job -oozie http://bigdata-00:11000/oozie -config my-apps/map-reduce/job.properties -run
  1. 查看測試結(jié)果
    yarn任務(wù)執(zhí)行界面


    16.png

    oozie的web界面


    17.png

    輸出文件目錄
    18.png

自定義實現(xiàn)WorkFlow中shell action

  1. 拷貝默認(rèn)的shell目錄來進(jìn)行修改
$ cp -r ./examples/apps/shell/ my-apps/
  1. 定義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
  1. 定義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>
  1. 定義要實現(xiàn)的腳本


    19.png
  2. 上傳到hdfs后運行


    20.png
  3. 查看運行結(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))。

  1. 如果要設(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");
}
  1. 拷貝模板中的coordinator案例
    $ cp -r examples/apps/cron-schedule/ my-apps/
  2. 修改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}
  1. 修改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>
  1. oozie的默認(rèn)配置中,至少為每5分鐘執(zhí)行一次,所以需要修改默認(rèn)配置


    24.png
  2. 上傳至hdfs后執(zhí)行


    25.png
  3. 查看執(zhí)行結(jié)果


    27.png

    26.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首先,我們在使用前先看看HDFS是什麼?這將有助于我們是以后的運維使用和故障排除思路的獲得。 HDFS采用mast...
    W_Bousquet閱讀 4,435評論 0 2
  • 為什么需要任務(wù)調(diào)度框架 在進(jìn)行數(shù)據(jù)處理的時候,需要進(jìn)行數(shù)據(jù)采集、數(shù)據(jù)清洗、數(shù)據(jù)分析等操作,每一個過程都可能涉及到多...
    心_的方向閱讀 6,349評論 1 6
  • 之前的有點忘記了,這里在云筆記拿出來再玩玩.看不懂的可以留言 大家可以嘗試下Ambari來配置Hadoop的相關(guān)環(huán)...
    HT_Jonson閱讀 3,184評論 0 50
  • 這個世界像是個萬花筒。記憶有時候是任性的,它忘記了很多煙花綻放,卻記住了后來毫不起眼的幾縷煙。 一 2012年,我...
    在下行之閱讀 3,304評論 22 36
  • 早上6點,躺在床上,睡眼朦朧翻著手機,忽見新聞“杜蘭特宣布加盟勇士”,what?頓時睡意全無,趕忙去體育頻道確認(rèn)消...
    余少閱讀 1,217評論 30 3

友情鏈接更多精彩內(nèi)容