1. 程式人生 > >oozie 工作流排程引擎總結(一)

oozie 工作流排程引擎總結(一)

oozie是服務於hadoop生態系統的工作流排程工具,job執行平臺是區別於其他排程工具的最大的不同。但其實現的思路跟一般排程工具幾乎完全相同。

首先是作為排程系統兩大核心:依賴和觸發。依賴可以是條件依賴,比如,資源依賴,依賴於某些資料檔案的存在,也可以是任務依賴,比如依賴於另一個job的完成。在oozie裡,每一個job對應一個action節點,這個節點可以是java,hadoop FS,mapred,hive,sqoop,OS shell等等。job之間的依賴通過動作節點完成,fork,join等。

觸發主要指時間觸發。依賴和觸發在動作的方向上是相互的,依賴是必要條件,而觸發是充分條件。

其次,排程系統本身不會去執行具體的job,而是將job相關的所有資源傳送到真實的執行環境,比如hadoop jobtractor,hive client,關係型資料庫系統等等,自己僅僅記錄並監視job的執行狀態,並對其狀態的變化作出相應的動作,比如,job失敗可以重新執行,job成功轉到下一個節點。傳送job的過程是一個非阻塞的行為,個別例外(比如hadoop fs操作)。

第三,排程系統本身可以是任意程式,例如,linux上的一個指令碼程式發起的精靈程序,一個web 工程,也可以是個GUI的軟體工具。

oozie作為一個排程引擎,是不同於hadoop的jobtracker實現的排程器的,雖然兩者均為”Schedule“之意。oozie負責任務的排程分發,是指從提交作業的本地,將資源傳送到job執行環境,比如hadoop叢集。這個“分發”行為發生在hadoop叢集外。而jobtracker是將hadoop作業拆分成若干個mapred子job,分派給tasktracker去執行。這個”分發“行為發生在hadoop叢集內,是應用程式本身的功能,它可以自己選擇job執行的先後順序,或者停止一個正在執行的job,讓出資源給另一個job,控制的更為精細。跟傳統意義上的排程工具含義不同。

值得一提的是,oozie是apache的開源專案,但我們一般用cloudera或yahu的商用免費版,因為後者修復了apache版很多bug,並支援更多的功能。

oozie server是一個java web,可以用內建的tomcat容器,也可以用外部的,記錄的資訊比如日誌等放在資料庫中,推薦配置個mysql。

 oozie 的安裝是有點複雜的,需要仔細閱讀文件。執行oozie應用時,作業配置檔案,jar包,相關程式程式碼,比如hive ql要放在hdfs上,只有屬性檔案放在本地磁碟。

下面是幾個例子:

 coordinator.xml內容:

<coordinator-app name="cron-coord" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="UTC"
                 xmlns="uri:oozie:coordinator:0.1">
        <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>

workflow。xml內容:

<workflow-app xmlns="uri:oozie:workflow:0.2" name="hive-wf">
    <start to="forking"/>

    <fork name="forking">
        <path start="hive-node"/>
        <path start="hive-node2"/>
    </fork>

    <action name="hive-node">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>
	    <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>oozie.hive.defaults</name>
                    <value>my-hive-default.xml</value>
                </property>
            </configuration>
            <script>dim_shop_category2.ql</script>
            <param>ARG_OPTIME_ISO=${ARG_OPTIME_ISO}</param>
        </hive>
        <ok to="joining"/>
        <error to="fail"/>
    </action>


        <action name="hive-node2">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>   
                    <name>oozie.hive.defaults</name>
                    <value>my-hive-default.xml</value>
                </property>  
            </configuration>
            <script>dim_shop_category3.ql</script>
            <param>ARG_OPTIME_ISO=${ARG_OPTIME_ISO}</param>        
        </hive>
        <ok to="joining"/>
        <error to="fail"/>
    </action>

         <join name="joining" to="hive-node3"/>

            <action name="hive-node3">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <job-xml>hdfs://master:54310/user/hadoop/examples/apps/hive5/conf/hive-site.xml</job-xml>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>oozie.hive.defaults</name>
                    <value>my-hive-default.xml</value>
                </property>
            </configuration>
            <script>dim_shop_category4.ql</script>
        </hive>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    
    <kill name="fail">
        <message>Hive failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
    
    </workflow-app>


該程式實現了每十分鐘執行一次含有三個hive任務的job,timezone=“UTC”表示中央時區區時,可在oozie-site中配置為東八區時間,GMT+0800.

oozie除了通過配置方式,經由oozie client 提交job外,還可以用其api來提交。workflow,properties等都可以通過java api來實現,並提交給oozie server。

oozie動作節點的擴充套件:

1、繼承ActionExcutor編寫自定義節點類。

2、為新組建定義schema,並新增到oozie-site配置檔案中。

3、oozie-site.xml中註冊新組建。

後面就可以在工作流配置檔案中使用新的動作節點了。