1.概述
在《高可用Hadoop平臺-Oozie工作流》一篇中,給大家分享瞭如何去單一的整合Oozie這樣一個外掛。今天為大家介紹如何去使用Oozie建立相關工作流執行與Hadoop上,已經在建立過程當中需要注意的事項,下面是今天的分享目錄:
- Oozie簡介
- 任務工作流
- 截圖預覽
下面開始今天的內容分享。
2.Oozie簡介
在Oozie中有幾個重要的概念,他們分別是:
- WorkFlow:工作流,控制工作流的開始和結束過程,以及工作流Job的執行路徑,並提供一種機制來控制工作流執行路徑(比如:Decision、Fork以及Join節點等),其書寫方式如下所示:
<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1"> ... 省略詳細內容 ... </workflow-app>
- Coordinator:多個WorkFlow可以組成一個Coordinator,可以把前幾個WorkFlow的輸出作為後一個WorkFlow的輸入,當然也可以定義WorkFlow的觸發條件,來做定時觸發,其書寫方式如下所示:
<coordinator-app name="[CD-DEF-NAME]" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="GMT+0800" 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> <action> <workflow> ... </workflow> </action> </coordinator-app>
- Bundle:控制一個或多個Coordinator應用,其寫法如下所示:
<bundle-app name=[NAME] xmlns='uri:oozie:bundle:0.1'> <controls> <kick-off-time>[DATETIME]</kick-off-time> </controls> <coordinator name=[NAME] > <app-path>[COORD-APPLICATION-PATH]</app-path> <configuration> <property> <name>[PROPERTY-NAME]</name> <value>[PROPERTY-VALUE]</value> </property> ... </configuration> </coordinator> ... </bundle-app>
3.任務工作流
下面,我們在Hadoop平臺下去建立這樣一個工作流,首先,我們需要配置Hadoop的core-site.xml檔案,在該檔案中新增以下內容:
- core-site.xml
<!-- OOZIE --> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> </property>
然後,在去修改Oozie的oozie-site.xml檔案,在該檔案中新增如下內容如下:
- oozie-site.xml
<property> <name>oozie.services</name> <value> org.apache.oozie.service.SchedulerService, org.apache.oozie.service.InstrumentationService, org.apache.oozie.service.MemoryLocksService, org.apache.oozie.service.UUIDService, org.apache.oozie.service.ELService, org.apache.oozie.service.AuthorizationService, org.apache.oozie.service.UserGroupInformationService, org.apache.oozie.service.HadoopAccessorService, org.apache.oozie.service.JobsConcurrencyService, org.apache.oozie.service.URIHandlerService, org.apache.oozie.service.DagXLogInfoService, org.apache.oozie.service.SchemaService, org.apache.oozie.service.LiteWorkflowAppService, org.apache.oozie.service.JPAService, org.apache.oozie.service.StoreService, org.apache.oozie.service.SLAStoreService, org.apache.oozie.service.DBLiteWorkflowStoreService, org.apache.oozie.service.CallbackService, org.apache.oozie.service.ActionService, org.apache.oozie.service.ShareLibService, org.apache.oozie.service.CallableQueueService, org.apache.oozie.service.ActionCheckerService, org.apache.oozie.service.RecoveryService, org.apache.oozie.service.PurgeService, org.apache.oozie.service.CoordinatorEngineService, org.apache.oozie.service.BundleEngineService, org.apache.oozie.service.DagEngineService, org.apache.oozie.service.CoordMaterializeTriggerService, org.apache.oozie.service.StatusTransitService, org.apache.oozie.service.PauseTransitService, org.apache.oozie.service.GroupsService, org.apache.oozie.service.ProxyUserService, org.apache.oozie.service.XLogStreamingService, org.apache.oozie.service.JvmPauseMonitorService </value> </property> <property> <name>oozie.service.HadoopAccessorService.hadoop.configurations</name> <value>*=/home/hadoop/hadoop-2.6.0/etc/hadoop</value> </property>
在修改完相關檔案後,下面我們去建立Oozie的sharelib,其命令如下所示:
oozie-setup.sh sharelib create -fs hdfs://cluster1
然後使用shareliblist命令檢視相關內容,命令如下所示:
oozie admin -shareliblist -oozie http://nna:11000/oozie
若成功建立,會生成如下圖所示內容:
若未出現相應內容,請檢查相關資訊是否配置正確即可。
- 啟動Oozie服務
oozied.sh start
注:在啟動時,這裡建議開啟oozie的啟動日誌,動態觀察相關日誌資訊,也許會出現一些異常資訊,比如:
Caused by: java.lang.NoClassDefFoundError: org/htrace/Trace at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:214) Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/ServiceException at org.apache.hadoop.ipc.ProtobufRpcEngine.<clinit>(ProtobufRpcEngine.jav
這些異常資訊大多是由於我們在前面打包生成war包時,由於缺少相關的依賴JAR包導致的,這裡我們將缺少的JAR從Hadoop的share目錄下找到對應的JAR拷貝到Oozie執行war包容器下即可,如:
$OOZIE_HOME/oozie-server/webapps/oozie/WEB-INF/lib
這裡,異常都有相應的提示,大家耐心的按照提示解決異常即可,在解決相關異常後,我們就可以去建立相關工作流。
Oozie給我們提供了相關示例讓我去參考配置,下面我們將examples/apps下的檔案上傳到HDFS當中去,這裡我上傳在HDFS的/oozie目錄下。接下來,我給大家去演示一個定時任務。首先,我們進去到apps目錄下的cron目錄,這是一個定時任務的示例,其中包含:coordinator.xml、job.properties和workflow.xml三個檔案,這裡我們對其進行配置。
- coordinator.xml
<coordinator-app name="cron-coord" frequency="${coord:minutes(10)}" start="${start}" end="${end}" timezone="GMT+0800" xmlns="uri:oozie:coordinator:0.2"> <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>
這裡配置的頻率為10分鐘,該屬性可配置其它頻率(如:小時,天等)。
- job.properties
nameNode=hdfs://cluster1 jobTracker=nna:8132 queueName=default examplesRoot=examples oozie.coord.application.path=${nameNode}/oozie/${examplesRoot}/apps/cron start=2015-08-25T13:00+0800 end=2015-08-26T01:00+0800 workflowAppUri=${nameNode}/oozie/${examplesRoot}/apps/cron
這裡由於使用Hadoop2.x的HA特性,在指定NameNode時,直接使用hdfs://cluster1,在Hadoop2.x後,jobTracker被替換了,這裡將其地址指向resourcemanager.address的地址。
- workflow.xml
<workflow-app xmlns="uri:oozie:workflow:0.2" name="one-op-wf"> <start to="end"/> <end name="end"/> </workflow-app>
工作流使用一個空的Job。
在配置完相關檔案後,我們將workflow.xml和coordinator.xml上傳到指定的HDFS地址(之前上傳examples目錄下的corn目錄下,上傳之前先刪除存在的檔案),最後,我們啟動這樣一個工作流,命令如下所示:
$OOZIE_HOME/bin/oozie job -oozie http://nna:11000/oozie -config job.properties -run
建立成功後,會生成一個JobID,如下圖所示:
注:圖中我將命令封裝在Shell指令碼當中。這裡在建立工作流時,同樣建議動態開啟Oozie的執行日誌,便於檢視異常資訊。
若是需要Kill任務,可以使用以下命令:
$OOZIE_HOME/bin/oozie job -oozie http://nna:11000/oozie -kill [JOB_ID]
其Job DAG如下圖所示:
4.截圖預覽
在提交作業後,我們可以通過瀏覽Oozie的Web監控介面觀察相關資訊,如下圖所示:
5.總結
在將Oozie整合到Hadoop平臺時,會有點繁瑣,出現的異常都會在日誌中有詳細的記錄,我們可以根據這些記錄去解決出現的異常。另外,我們在提交任務成功後,在Oozie執行期間若是出現異常,我們也可以通過Oozie的監控介面去非常方便的檢視對應的異常資訊,並排除。異常資訊較多,需要我們耐心的閱讀相關記錄資訊。
6.結束語
這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!