1. 程式人生 > >Oozie框架基礎

Oozie框架基礎

caption 之前 觀察 tar -c eal fork mod job調度

* Oozie框架基礎

官方文檔地址:http://oozie.apache.org/docs/4.0.0/DG_QuickStart.html

除Oozie之外,類似的框架還有:

** Zeus:https://github.com/michael8335/zeus2

** Azkaban:https://azkaban.github.io/

感興趣的朋友可以自行查閱。

Oozie框架簡介:

** Oozie單詞釋義:馴象人

** 一個基於工作流引擎的開源框架,由Cloudera公司貢獻給Apache,提供對Hadoop Mapreduce、Pig Jobs的任務調度與協調。Oozie需要部署到Java Servlet容器中運行。

** 以xml的形式寫調度流程,可以調度mr,pig,hive,shell,jar等。

Oozie主要功能:

** Workflow: 順序執行流程節點,支持fork(分支多個節點),join(合並多個節點為一個)

** Coordinator,定時觸發workflow

** Bundle Job,綁定多個coordinator

Oozie節點:

** 控制流節點(Control Flow Nodes):

控制流節點一般都是定義在工作流開始或者結束的位置,比如start,end,kill等。以及提供工作流的執行路徑機制,如decision,fork,join等。

** 動作節點(Action Nodes):

簡而不能再簡的言之,就是主要就是執行一些動作,比如FS ACTION,可以刪除HDFS上的文件,創建文件夾等等等等

接下來我們實際操作感受一下。

* Oozie下載

鏈接:http://pan.baidu.com/s/1hs85SdI 密碼:1bkq

* ext依賴包下載

Oozie的工作依賴於另一個library,ExtJS,WHY?該依賴包主要是提供一個Oozie的界面,如果不需要界面,可以省略。

鏈接:http://pan.baidu.com/s/1nvv40B3 密碼:x5n2

* Oozie部署

(與之前幾節內容重復則不再贅述,比如解壓,安裝之類的)

1、 Hadoop已經成功安裝並配置

2、 解壓Oozie到指定目錄

3、 配置文件

core-site.xml

添加屬性:

hadoop.proxyuser.z.hosts:*,即:OOZIE_SERVER_HOSTNAME

hadoop.proxyuser.z.groups:*,即:USER_GROUPS_THAT_ALLOW_IMPERSONATION

如圖:

技術分享圖片

尖叫提示:如果你的集群不是單節點狀態,則需要把該core-site.xml文件scp到集群中的其他機器,此處為z02,z03機器。

尖叫提示:你還需要開啟mr-jobhistory-daemon.sh服務

4、 如果HDFS已經開啟,則需要重啟Hadoop的DFS系統

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/

註意,解壓之後,你會發現hadooplibs直接在Oozie目錄下了,是以內壓縮包的根目錄結構就是Oozie根目錄。

6、在Oozie的根目錄下,創建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需要數據庫支持,所以需要安裝一個Mysql數據庫

由於之前已經安裝了Mysql了,此處不再贅述如何安裝Mysql。

創建一個oozie數據庫,然後把mysql驅動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、設置oozie

** 上傳oozie目錄下的yarn.tar.gz(會自行解壓)文件到HDFS

命令如下:

$ bin/oozie-setup.sh sharelib create -fs hdfs://z01:8020 -locallib oozie-sharelib-4.0.0-cdh5.3.6-yarn.tar.gz,執行後如圖,註意,該指令一定要在活躍的NameNode節點執行。如果不在,請自行想辦法。(方式之前小節已經講解)

技術分享圖片

** 創建oozie.sql文件

$ bin/oozie-setup.sh db create -run -sqlfile oozie.sql,如圖則成功:

技術分享圖片

** 打包項目,生成war

$ bin/oozie-setup.sh prepare-war,如圖則成功:

技術分享圖片

** 啟動oozie,通過瀏覽器訪問oozie界面

$ bin/oozied.sh start

地址:http://192.168.122.200:11000/oozie,界面如圖:

技術分享圖片

* 案例

例1:oozie調度shell腳本

** 解壓oozie根目錄下的案例

$ tar -zxf oozie-examples.tar.gz

** 創建自定義任務文件夾,並拷貝任務模板

$ mkdir oozie-apps/

$ cp -r examples/apps/shell/ oozie-apps/

** 創建腳本p1.sh,隨便寫一個任務啦,如圖:

技術分享圖片 技術分享圖片

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

job.properties:

技術分享圖片

workflow.xml:

技術分享圖片

** 上傳任務配置到HDFS

尖叫提示:任務配置文件每次在本地修改後,如需執行,都需要重新上傳到HDFS,因為Oozie不支持本地運行。

上傳:

$ /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/

** 提交執行該任務

$ bin/oozie job -oozie http://z01:11000/oozie -config oozie-apps/shell/job.properties -run,在Oozie界面可以看到:

技術分享圖片

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

技術分享圖片

尖叫提示:

現象:你執行了某個任務,通過shell腳本向本地tmp目錄下寫.log文件,然後,找不到?

原因:排除你任務執行失敗之外,看一看你的其他機器對應目錄是否有.log文件生成?

解釋:因為shell腳本執行為當前機器節點,所以在resourcemanager調度任務給某一個NodeManager

執行時,該.log日誌文件的生成會在任務執行所在的NodeManager節點上生成。

** 殺掉某個任務

當任務卡死或者無效,可以選擇殺死該任務

$ bin/oozie job -oozie http://z01:11000/oozie -kill 0000004-170425105153692-oozie-z-W

例2:執行多個Job調度

** 創建兩個shell腳本

此處我直接利用剛才的p1.sh復制出來一個p2.sh

$ cp -a oozie-apps/shell/p1.sh oozie-apps/shell/p2.sh

改變p2.sh如圖:

技術分享圖片 註意ls命令的絕對路徑不是sbin

對應的配置文件,修改如圖所示:

job.properties:

技術分享圖片

workflow.xml:

技術分享圖片

** 上傳後,執行該任務,不再贅述。該任務流程為:先執行action1,如果action1成功,則執行action2,然後結束,否則直接結束。

此處可以看到,運行結果:

技術分享圖片

尖叫提示:重新上傳前,需要先刪除HDFS中的oozie-apps文件夾

例3:調度mapreduce任務

** 首先拷貝示例模板

$ cp -r examples/apps/map-reduce/ oozie-apps/

** 刪除map-reduce/lib目錄下示例的jar包,一會存放自己的jar

$ rm -rf oozie-apps/map-reduce/lib/*

** 在DFS系統中創建input文件夾並傳入words.txt文件,然後運行測試前幾節我們打包好的Jar包,即單詞統計任務(這一步在之前的HDFS講解中重復很多遍了,所以不在贅述)

$ /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*,一頓操作後,結果如圖:

技術分享圖片

** 配置文件

job.properties:

技術分享圖片

workflow.xml:

技術分享圖片 一定要指定key和value是輸出類型

註意,配置workflow.xml文件時,裏面的property屬性需要結合具體情況配置,比如我剛才已經運行了一個MyWordCount任務了,我可以通過yarn平臺的界面來查找相關屬性,打開8088端口界面,找到剛才運行的任務,點擊history:

技術分享圖片

然後出現如下界面,點擊Configuration:

技術分享圖片

然後在右上角搜索api這個關鍵字:

技術分享圖片

綠色框體中的內容即為屬性名,藍色窗體即為屬性值,大家自己對應查找即可,然後完成workflow.xml文件的配置。

** 拷貝MyWordCount.jar到oozie-apps/map-reduce/lib目錄下

這裏根據我的情況,我之前的MyWordCount.jar包存放於另外一個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/

** 運行任務

$ bin/oozie job -oozie http://z01:11000/oozie -config oozie-apps/map-reduce/job.properties -run,成功結果如圖:

技術分享圖片 技術分享圖片

例4:使用Coordinator周期性調度任務

** 配置時區

如圖:+0800是東八區區時,如果不是此時區,查詢如何修改時區,在此不贅述。

技術分享圖片

** 修改oozie-site.xml文件

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

技術分享圖片

** 修改oozie-console.js文件中的時區設定

$ cat /opt/modules/cdh/oozie-4.0.0-cdh5.3.6/oozie-server/webapps/oozie/oozie-console.js,搜索TimeZone函數,修改為如下:

技術分享圖片

** 重啟oozie,並清除瀏覽器緩存,不放心的話,可以換另一個瀏覽器打開即可

$ bin/oozied.sh stop

$ bin/oozied.sh start

** 拷貝coordinator周期任務模板

首先,還是先去examples裏面拷貝個任務配置模板出來

$ cp -r examples/apps/cron/ oozie-apps/

** 修改job.properties、coordinator.xml文件,workflow文件就用案例1的即可。

由於我打算讓coordinator來調度案例1的workflow任務,所以,先把案例1的workflow.xml復制到cron目錄下。

$ cp oozie-apps/shell/workflow.xml oozie-apps/cron/

當然了,還有那個具體的腳本p1.sh和p2.sh

$ cp oozie-apps/shell/p1.sh oozie-apps/shell/p2.sh oozie-apps/cron/

然後修改job.properties文件:

技術分享圖片

然後修改coordinator.xml文件:

技術分享圖片

修改內容:frequency修改為5分鐘執行一次,時區修改為GMT+0800,註意,coordinator執行頻率最小為5分鐘一次。

** 運行測試

先上傳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

請自行觀察其5分鐘執行一次,執行到明天結束。

技術分享圖片

* 總結

oozie調度框架的學習,如果概念不了解,可以先在似懂非懂的狀態下把例子學會,再回顧知識點,自然就理解了。


個人微博:http://weibo.com/seal13

QQ大數據技術交流群(廣告勿入):476966007



作者:Z盡際
鏈接:https://www.jianshu.com/p/6ef2fdb3f8cb
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

Oozie框架基礎