高可用Hadoop平臺-Oozie工作流之Hadoop排程

哥不是小蘿莉發表於2015-08-25

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.結束語

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉! 

相關文章