天天看點

開源任務管理架構oozie學習

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等版本号,根據版本擷取依賴包,生成安裝檔案;

開源任務管理架構oozie學習

2)、編譯成功之後會在distro/target下生成一個oozie-4.3.1-distro.tar.gz 安裝檔案,解壓安裝檔案,将oozie.war增加extjs 包和資料庫jdbc連接配接包之後,從先打包成新的war包;

3)、通過oozie.sql 建立資料庫,導入環境變量,執行oozie-run.sh,啟動成功,界面為11000端口通路:

開源任務管理架構oozie學習

2、 oozie的架構及實作原理

元件架構圖如下:

開源任務管理架構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