1、 oozie簡介
應用背景:在工作中,可能需要好幾個Hadoop作業(job)來協作完成,往往一個job的輸出會被當做另一個job的輸入來使用,這個時候就涉及到了資料流的處理。
我們不可能就盯着程式,等它運作完再去運作下一個程式,是以,一般的做法就是通過shell來做,但是如果涉及到的工作流很複雜(比方說有1,2,3,4四個作業,1的輸出作為2 3 4的輸入,然後2 3的結果運算之後再和1的結果進行某種運算……最後再輸出)是很費時費力的。這裡就用到了oozie——一個能把多個MR作業組合為一個邏輯工作單元(一個工作流),進而自動完成任務調用的工具。
oozie字面釋義為訓象人,是一個基于Hadoop的開源工作流排程架構,運作在内置的Tomcat中,支援多種Hadoop類型作業排程,如常見的MapReduce、hive、spark、shell腳本等任務。
特點:1)、基于Hadoop的任務流的任務排程系統;(任務流基于workflow.xml配置檔案去定義,主要圍繞Hadoop的平台元件的任務排程);
2) 、工作流是由action組成的有向無環圖(DAG);
3)、多個workflow(任務流)可以組成一個coordinator(協調器),多個coordinator可以抽象成bundle。coordinator job是由時間(頻率)和資料可用性觸發的重複的workflow jobs;
4)、支援Hadoop平台的多種任務類型,如Java map-reduce, Streaming map-reduce, Pig, Hive, Sqoop and Distcp,同時也支援Java 程式和shell腳本等;
5)、oozie是一個可伸縮、高可用、可擴充的系統;(基于Hadoop平台而言)
oozie 安裝:1)從Apache官網下載下傳源碼,通過maven編譯生成安裝包,mkdistro.sh腳本編譯需要指定Hadoop、hive、spark等版本号,根據版本擷取依賴包,生成安裝檔案;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3ATO2UzNxcDMy0yM3kDMzgzM3EDNxEDM5EDMy0yM3UjN2ETMvwVMwkTMwIzLcNzN1YjNxEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
2)、編譯成功之後會在distro/target下生成一個oozie-4.3.1-distro.tar.gz 安裝檔案,解壓安裝檔案,将oozie.war增加extjs 包和資料庫jdbc連接配接包之後,從先打包成新的war包;
3)、通過oozie.sql 建立資料庫,導入環境變量,執行oozie-run.sh,啟動成功,界面為11000端口通路:
2、 oozie的架構及實作原理
元件架構圖如下:
原理:oozie對工作流的編排,是基于workflow.xml檔案來完成的,使用者預先将工作流執行規則定制于workflow.xml檔案中,并在job.properties配置相關的參數,然後由oozie server 向伺服器送出一個JOB來啟動工作流。
工作流由兩種節點組成,分别為控制流節點和執行節點:
控制流節點(Control Flow Nodes):控制工作流的執行路徑,包括start、end、kill、decision、fork、join等;
行為節點(Action Nodes):決定每個操作執行的任務類型,包括map-reduce,java,hive,shell,pig等;
3、工作流配置
一個oozie 的 job 一般由以下檔案組成(檔案需要上傳到HDFS,不支援本地運作):
job.properties :記錄了job的屬性;
workflow.xml :定義任務的流程和分支;
lib目錄:用來執行具體的任務,也就是我們需要執行的jar包或指令檔案;
job.properties 配置檔案:
nameNode=hdfs://127.0.0.1:8020 //HDFS 位址
jobTracker=127.0.0.1:8032 // 配置resourcemanager位址
queueName=default //oozie隊列名稱(預設default)
examplesRoot=examples //全局目錄(預設examples)
oozie.use.system.libpath=true //是否加載使用者lib目錄
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark
//任務流位址(workflow.xml所在位址)
//user.name 目前使用者
workflow.xml 配置檔案:
spark action:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.3">
...
<action name="[NODE-NAME]">
<spark xmlns="uri:oozie:spark-action:0.1">
<job-tracker>[JOB-TRACKER]</job-tracker>
<name-node>[NAME-NODE]</name-node>
<prepare> //任務啟動之前執行檔案操作
<delete path="[PATH]"/>
...
<mkdir path="[PATH]"/>
...
</prepare>
<job-xml>[SPARK SETTINGS FILE]</job-xml>
//指定spark job的配置檔案,多個配置檔案可以配置多個标簽
<configuration>
//需要對spark進行定義的配置屬性,如name為mapred.compress.map.output,value為true
<property>
<name>[PROPERTY-NAME]</name>
<value>[PROPERTY-VALUE]</value>
</property>
...
</configuration>
<master>[SPARK MASTER URL]</master> //yarn-cluster 、yarn-master等
<mode>[SPARK MODE]</mode> //spark 運作模式client、cluster等
<name>[SPARK JOB NAME]</name> //job name
<class>[SPARK MAIN CLASS]</class>
<jar>[SPARK DEPENDENCIES JAR / PYTHON FILE]</jar>
// jar包或python檔案,多個以,分隔
<spark-opts>[SPARK-OPTIONS]</spark-opts> //傳遞給driver的參數,如—conf,--driver-memory 等
<arg>[ARG-VALUE]</arg> //指定spark job參數,如inputpath,value等
...
</spark>
<ok to="[NODE-NAME]"/> //執行成功之後下一個執行action
<error to="[NODE-NAME]"/> //執行失敗之後下一個執行action
</action>
...
</workflow-app>
hive action:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.4">
...
<action name="[NODE-NAME]">
<hive2 xmlns="uri:oozie:hive2-action:0.1">
<job-tracker>[JOB-TRACKER]</job-tracker>
<name-node>[NAME-NODE]</name-node>
<prepare>
<delete path="[PATH]"/>
...
<mkdir path="[PATH]"/>
...
</prepare>
<job-xml>[HIVE SETTINGS FILE]</job-xml>
<configuration>
<property>
<name>[PROPERTY-NAME]</name>
<value>[PROPERTY-VALUE]</value>
</property>
...
</configuration>
<jdbc-url>[jdbc:hive2://HOST:10000/default]</jdbc-url>
<password>[PASS]</password>
<script>[HIVE-SCRIPT]</script> //指定hive腳本的執行檔案
<param>[PARAM-VALUE]</param> //對hive腳本中定義的變量進行值傳遞
...
<param>[PARAM-VALUE]</param>
<argument>[ARG-VALUE]</argument> //beeline 指令行的參數值傳遞
...
</hive2>
<ok to="[NODE-NAME]"/>
<error to="[NODE-NAME]"/>
</action>
...
</workflow-app>
4、例子
以自帶的example為示例,配置job.properties:
public final class SparkFileCopy {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: SparkFileCopy <file> <file>");
System.exit(1);
}
SparkConf sparkConf = new SparkConf().setAppName("SparkFileCopy");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = ctx.textFile(args[0]);
lines.saveAsTextFile(args[1]);
System.out.println("Copied file from " + args[0] + " to " + args[1]);
ctx.stop();
}
}
任務送出指令:oozie job -oozie http://127.0.0.1:11000/oozie -config job.properties -run
job.properties 配置:
nameNode=hdfs://127.0.0.1:8020
jobTracker=127.0.0.1:8032
master=yarn-client
queueName=default
examplesRoot=examples
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/spark
轉載于:https://www.cnblogs.com/lihao7/p/10268204.html