* Oozie部署
(與之前幾節(jié)內(nèi)容重復(fù)則不再贅述,比如解壓,安裝之類的)
1、 Hadoop已經(jīng)成功安裝并配置
2、 解壓Oozie到指定目錄
3、 配置文件
core-site.xml
添加屬性:
hadoop.proxyuser.z.hosts:*,即:OOZIE_SERVER_HOSTNAME
hadoop.proxyuser.z.groups:*,即:USER_GROUPS_THAT_ALLOW_IMPERSONATION
如圖:

尖叫提示:如果你的集群不是單節(jié)點(diǎn)狀態(tài),則需要把該core-site.xml文件scp到集群中的其他機(jī)器,此處為z02,z03機(jī)器。
尖叫提示:你還需要開啟mr-jobhistory-daemon.sh服務(wù)
4、 如果HDFS已經(jīng)開啟,則需要重啟Hadoop的DFS系統(tǒng)
5、解壓hadooplibs
$ tar -zxf /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/oozie-hadooplibs-4.0.0-cdh5.3.6.tar.gz -C /opt/modules/cdh/
注意,解壓之后,你會(huì)發(fā)現(xiàn)hadooplibs直接在Oozie目錄下了,是以內(nèi)壓縮包的根目錄結(jié)構(gòu)就是Oozie根目錄。
6、在Oozie的根目錄下,創(chuàng)建libext/目錄
$ mkdir libext/
7、將hadooplibs里面的jar包,拷貝到libext目錄下
$ cp -ra /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/hadooplibs/hadooplib-2.5.0-cdh5.3.6.oozie-4.0.0-cdh5.3.6/* libext/
8、將ext-2.2.zip拷貝到libext/目錄下
$ cp /opt/softwares/ext-2.2.zip libext/
9、修改配置文件
oozie-site.xml,修改如下屬性,注意,不是替換,只是修改,如圖:

10、由于Oozie需要數(shù)據(jù)庫支持,所以需要安裝一個(gè)Mysql數(shù)據(jù)庫
由于之前已經(jīng)安裝了Mysql了,此處不再贅述如何安裝Mysql。
創(chuàng)建一個(gè)oozie數(shù)據(jù)庫,然后把mysql驅(qū)動(dòng)jar拷貝至libext,操作如下:
$ mysql -uroot -p123456
mysql> create database oozie;
exit;
$ cp /opt/modules/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/libext/
11、設(shè)置oozie
** 上傳oozie目錄下的yarn.tar.gz(會(huì)自行解壓)文件到HDFS
命令如下:
$ bin/oozie-setup.sh sharelib create -fs hdfs://z01:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz,執(zhí)行后如圖,注意,該指令一定要在活躍的NameNode節(jié)點(diǎn)執(zhí)行。如果不在,請(qǐng)自行想辦法。(方式之前小節(jié)已經(jīng)講解)

** 創(chuàng)建oozie.sql文件
$ bin/oozie-setup.sh db create -run -sqlfile oozie.sql,如圖則成功:

** 打包項(xiàng)目,生成war
$ bin/oozie-setup.sh prepare-war,如圖則成功:

** 啟動(dòng)oozie,通過瀏覽器訪問oozie界面
$ bin/oozied.sh start
地址:http://192.168.122.200:11000/oozie,界面如圖:

* 案例
例1:oozie調(diào)度shell腳本
** 解壓oozie根目錄下的案例
$ tar -zxf oozie-examples.tar.gz
** 創(chuàng)建自定義任務(wù)文件夾,并拷貝任務(wù)模板
$ mkdir oozie-apps/
$ cp -r examples/apps/shell/ oozie-apps/
** 創(chuàng)建腳本p1.sh,隨便寫一個(gè)任務(wù)啦,如圖:


** 修改job.properties和workflow.xml文件
job.properties:

workflow.xml:

** 上傳任務(wù)配置到HDFS
尖叫提示:任務(wù)配置文件每次在本地修改后,如需執(zhí)行,都需要重新上傳到HDFS,因?yàn)镺ozie不支持本地運(yùn)行。
上傳:
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/oozie-apps/ /user/z/
** 提交執(zhí)行該任務(wù)
$ bin/oozie job -oozie http://z01:11000/oozie -config oozie-apps/shell/job.properties -run,在Oozie界面可以看到:

查看tmp目錄下生成的p1.log文件如下:

尖叫提示:
現(xiàn)象:你執(zhí)行了某個(gè)任務(wù),通過shell腳本向本地tmp目錄下寫.log文件,然后,找不到?
原因:排除你任務(wù)執(zhí)行失敗之外,看一看你的其他機(jī)器對(duì)應(yīng)目錄是否有.log文件生成?
解釋:因?yàn)閟hell腳本執(zhí)行為當(dāng)前機(jī)器節(jié)點(diǎn),所以在resourcemanager調(diào)度任務(wù)給某一個(gè)NodeManager
執(zhí)行時(shí),該.log日志文件的生成會(huì)在任務(wù)執(zhí)行所在的NodeManager節(jié)點(diǎn)上生成。
** 殺掉某個(gè)任務(wù)
當(dāng)任務(wù)卡死或者無效,可以選擇殺死該任務(wù)
$ bin/oozie job -oozie http://z01:11000/oozie -kill 0000004-170425105153692-oozie-z-W
例2:執(zhí)行多個(gè)Job調(diào)度
** 創(chuàng)建兩個(gè)shell腳本
此處我直接利用剛才的p1.sh復(fù)制出來一個(gè)p2.sh
$ cp -a oozie-apps/shell/p1.sh oozie-apps/shell/p2.sh
改變p2.sh如圖:

注意ls命令的絕對(duì)路徑不是sbin
對(duì)應(yīng)的配置文件,修改如圖所示:
job.properties:

workflow.xml:

** 上傳后,執(zhí)行該任務(wù),不再贅述。該任務(wù)流程為:先執(zhí)行action1,如果action1成功,則執(zhí)行action2,然后結(jié)束,否則直接結(jié)束。
此處可以看到,運(yùn)行結(jié)果:

尖叫提示:重新上傳前,需要先刪除HDFS中的oozie-apps文件夾
例3:調(diào)度mapreduce任務(wù)
** 首先拷貝示例模板
$ cp -r examples/apps/map-reduce/ oozie-apps/
** 刪除map-reduce/lib目錄下示例的jar包,一會(huì)存放自己的jar
$ rm -rf oozie-apps/map-reduce/lib/*
** 在DFS系統(tǒng)中創(chuàng)建input文件夾并傳入words.txt文件,然后運(yùn)行測試前幾節(jié)我們打包好的Jar包,即單詞統(tǒng)計(jì)任務(wù)(這一步在之前的HDFS講解中重復(fù)很多遍了,所以不在贅述)
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -mkdir /input/
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put /opt/modules/hadoop-2.5.0/words.txt /input/
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/yarn jar /opt/modules/hadoop-2.5.0/MyWordCount.jar /input/ /output/
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -cat /output/par*,一頓操作后,結(jié)果如圖:

** 配置文件
job.properties:

workflow.xml:

一定要指定key和value是輸出類型
注意,配置workflow.xml文件時(shí),里面的property屬性需要結(jié)合具體情況配置,比如我剛才已經(jīng)運(yùn)行了一個(gè)MyWordCount任務(wù)了,我可以通過yarn平臺(tái)的界面來查找相關(guān)屬性,打開8088端口界面,找到剛才運(yùn)行的任務(wù),點(diǎn)擊history:

然后出現(xiàn)如下界面,點(diǎn)擊Configuration:

然后在右上角搜索api這個(gè)關(guān)鍵字:

綠色框體中的內(nèi)容即為屬性名,藍(lán)色窗體即為屬性值,大家自己對(duì)應(yīng)查找即可,然后完成workflow.xml文件的配置。
** 拷貝MyWordCount.jar到oozie-apps/map-reduce/lib目錄下
這里根據(jù)我的情況,我之前的MyWordCount.jar包存放于另外一個(gè)hadoop目錄下了,所以:
$ cp -a /opt/modules/hadoop-2.5.0/MyWordCount.jar oozie-apps/map-reduce/lib/
** 上傳map-reduce目錄到HDFS的oozie-apps目錄
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/map-reduce/ /user/z/oozie-apps/
** 運(yùn)行任務(wù)
$ bin/oozie job -oozie http://z01:11000/oozie -config oozie-apps/map-reduce/job.properties -run,成功結(jié)果如圖:


例4:使用Coordinator周期性調(diào)度任務(wù)
** 配置時(shí)區(qū)
如圖:+0800是東八區(qū)區(qū)時(shí),如果不是此時(shí)區(qū),查詢?nèi)绾涡薷臅r(shí)區(qū),在此不贅述。

** 修改oozie-site.xml文件
添加如下屬性,該屬性可以去oozie-default.xml文件中查找

** 修改oozie-console.js文件中的時(shí)區(qū)設(shè)定
$ cat /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js,搜索TimeZone函數(shù),修改為如下:

** 重啟oozie,并清除瀏覽器緩存,不放心的話,可以換另一個(gè)瀏覽器打開即可
$ bin/oozied.sh stop
$ bin/oozied.sh start
** 拷貝coordinator周期任務(wù)模板
首先,還是先去examples里面拷貝個(gè)任務(wù)配置模板出來
$ cp -r examples/apps/cron/ oozie-apps/
** 修改job.properties、coordinator.xml文件,workflow文件就用案例1的即可。
由于我打算讓coordinator來調(diào)度案例1的workflow任務(wù),所以,先把案例1的workflow.xml復(fù)制到cron目錄下。
$ cp oozie-apps/shell/workflow.xml oozie-apps/cron/
當(dāng)然了,還有那個(gè)具體的腳本p1.sh和p2.sh
$ cp oozie-apps/shell/p1.sh oozie-apps/shell/p2.sh oozie-apps/cron/
然后修改job.properties文件:

然后修改coordinator.xml文件:

修改內(nèi)容:frequency修改為5分鐘執(zhí)行一次,時(shí)區(qū)修改為GMT+0800,注意,coordinator執(zhí)行頻率最小為5分鐘一次。
** 運(yùn)行測試
先上傳cron目錄到HDFS
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/bin/hdfs dfs -put oozie-apps/cron/ /user/z/oozie-apps/
$ bin/oozie job -oozie http://z01:11000/oozie -config oozie-apps/cron/job.properties -run
請(qǐng)自行觀察其5分鐘執(zhí)行一次,執(zhí)行到明天結(jié)束。
* 總結(jié)
oozie調(diào)度框架的學(xué)習(xí),如果概念不了解,可以先在似懂非懂的狀態(tài)下把例子學(xué)會(huì),再回顧知識(shí)點(diǎn),自然就理解了。