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中註冊新組建。
後面就可以在工作流配置檔案中使用新的動作節點了。