oozie是服務于hadoop生態(tài)系統(tǒng)的工作流調度工具,,job運行平臺是區(qū)別于其他調度工具的最大的不同。但其實現的思路跟一般調度工具幾乎完全相同,。 首先是作為調度系統(tǒng)兩大核心:依賴和觸發(fā),。依賴可以是條件依賴,比如,,資源依賴,,依賴于某些數據文件的存在,也可以是任務依賴,,比如依賴于另一個job的完成,。在oozie里,每一個job對應一個action節(jié)點,,這個節(jié)點可以是java,,hadoop FS,mapred,,hive,,sqoop,OS shell等等,。job之間的依賴通過動作節(jié)點完成,,fork,join等,。 觸發(fā)主要指時間觸發(fā),。依賴和觸發(fā)在動作的方向上是相互的,依賴是必要條件,,而觸發(fā)是充分條件,。 其次,調度系統(tǒng)本身不會去執(zhí)行具體的job,,而是將job相關的所有資源發(fā)送到真實的執(zhí)行環(huán)境,,比如hadoop jobtractor,hive client,,關系型數據庫系統(tǒng)等等,,自己僅僅記錄并監(jiān)視job的執(zhí)行狀態(tài),,并對其狀態(tài)的變化作出相應的動作,比如,,job失敗可以重新運行,,job成功轉到下一個節(jié)點。發(fā)送job的過程是一個非阻塞的行為,,個別例外(比如hadoop fs操作),。 第三,調度系統(tǒng)本身可以是任意程序,,例如,,linux上的一個腳本程序發(fā)起的精靈進程,一個web 工程,,也可以是個GUI的軟件工具,。 oozie作為一個調度引擎,是不同于hadoop的jobtracker實現的調度器的,,雖然兩者均為”Schedule“之意,。oozie負責任務的調度分發(fā),是指從提交作業(yè)的本地,,將資源發(fā)送到job運行環(huán)境,,比如hadoop集群。這個“分發(fā)”行為發(fā)生在hadoop集群外,。而jobtracker是將hadoop作業(yè)拆分成若干個mapred子job,,分派給tasktracker去執(zhí)行。這個”分發(fā)“行為發(fā)生在hadoop集群內,,是應用程序本身的功能,它可以自己選擇job執(zhí)行的先后順序,,或者停止一個正在執(zhí)行的job,,讓出資源給另一個job,控制的更為精細,。跟傳統(tǒng)意義上的調度工具含義不同,。
值得一提的是,oozie是apache的開源項目,,但我們一般用cloudera或yahu的商用免費版,,因為后者修復了apache版很多bug,并支持更多的功能,。 oozie server是一個java web,,可以用內置的tomcat容器,也可以用外部的,,記錄的信息比如日志等放在數據庫中,,推薦配置個mysql,。 oozie 的安裝是有點復雜的,需要仔細閱讀文檔,。運行oozie應用時,,作業(yè)配置文件,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>
oozie除了通過配置方式,經由oozie client 提交job外,,還可以用其api來提交,。workflow,properties等都可以通過java api來實現,,并提交給oozie server,。 oozie動作節(jié)點的擴展: 1、繼承ActionExcutor編寫自定義節(jié)點類,。 2,、為新組建定義schema,并添加到oozie-site配置文件中,。 3,、 oozie-site.xml中注冊新組建。 后面就可以在工作流配置文件中使用新的動作節(jié)點了,。
|
|