在 Linux 型 Azure HDInsight 上搭配 Apache Hadoop 使用 Apache Oozie 來定義並執行工作流程

瞭解如何在 Azure HDInsight 上搭配 Apache Hadoop 使用 Apache Oozie。 Oozie 是管理 Hadoop 作業的工作流程和協調系統。 Oozie 已與 Hadoop 堆疊整合,並支援下列作業:

  • Apache Hadoop MapReduce
  • Apache Pig
  • Apache Hive
  • Apache Sqoop

您也可以使用 Oozie 來排程系統的特定作業,例如 Java 程式或 Shell 指令碼。

注意

使用 HDInsight 定義工作流程的另一個選項是使用 Azure Data Factory。 若要深入瞭解 Data Factory,請參閱 搭配 Data Factory 使用 Apache Pig 和 Apache Hive。 若要在叢集上使用 Oozie 搭配企業安全性套件,請參閱 使用企業安全性套件在 HDInsight Hadoop 叢集中執行 Apache Oozie。

必要條件

範例工作流程

本檔中使用的工作流程包含兩個動作。 動作是工作的定義,例如執行Hive、Sqoop、MapReduce或其他行程:

HDInsight oozie workflow diagram.

  1. Hive 動作會執行 HiveQL 腳本,從 hivesampletable HDInsight 隨附的 擷取記錄。 每個數據列都會描述來自特定行動裝置的造訪。 記錄格式會顯示如下文字:

    8       18:54:20        en-US   Android Samsung SCH-i500        California     United States    13.9204007      0       0
    23      19:19:44        en-US   Android HTC     Incredible      Pennsylvania   United States    NULL    0       0
    23      19:19:46        en-US   Android HTC     Incredible      Pennsylvania   United States    1.4757422       0       1
    

    本檔中使用的Hive腳本會計算每個平臺的總瀏覽次數,例如Android或i電話,並將計數儲存到新的Hive數據表。

    如需Hive的詳細資訊,請參閱 [搭配 HDInsight 使用 Apache Hive][hdinsight-use-hive]。

  2. Sqoop 宏指令會將新 Hive 數據表的內容匯出至 Azure SQL 資料庫 中建立的數據表。 如需 Sqoop 的詳細資訊,請參閱 搭配 HDInsight 使用 Apache Sqoop。

注意

如需 HDInsight 叢集上支援的 Oozie 版本,請參閱 HDInsight 所提供的 Hadoop 叢集版本新功能。

建立工作目錄

Oozie 預期您會將作業所需的所有資源儲存在相同的目錄中。 這個範例會使用 wasbs:///tutorials/useoozie。 若要建立此目錄,請完成下列步驟:

  1. 編輯下列程式代碼,以叢集的 SSH 使用者名稱取代 sshuser ,並以叢集的名稱取代 CLUSTERNAME 。 然後輸入程式代碼,以使用 SSH 連線到 HDInsight 叢集

    ssh sshuser@CLUSTERNAME-ssh.azurehdinsight.net
    
  2. 若要建立目錄,請使用下列命令:

    hdfs dfs -mkdir -p /tutorials/useoozie/data
    

    注意

    參數 -p 會導致在路徑中建立所有目錄。 目錄 data 是用來保存文本所使用的 useooziewf.hql 數據。

  3. 編輯下列程式代碼,以您的 SSH 使用者名稱取代 sshuser 。 若要確定 Oozie 可以模擬您的使用者帳戶,請使用下列命令:

    sudo adduser sshuser users
    

    注意

    您可以忽略指出使用者已是群組成員的錯誤 users

新增資料庫驅動程式

此工作流程會使用 Sqoop 將數據匯出至 SQL 資料庫。 因此,您必須提供用來與 SQL 資料庫互動的 JDBC 驅動程式複本。 若要將 JDBC 驅動程式複製到工作目錄,請使用 SSH 工作階段中的下列命令:

hdfs dfs -put /usr/share/java/sqljdbc_7.0/enu/mssql-jdbc*.jar /tutorials/useoozie/

重要

確認存在於的實際 JDBC 驅動程式。/usr/share/java/

如果您的工作流程使用其他資源,例如包含 MapReduce 應用程式的 jar,您也必須新增這些資源。

定義Hive查詢

使用下列步驟來建立定義查詢的Hive查詢語言 (HiveQL) 文稿。 您將在本檔稍後的 Oozie 工作流程中使用查詢。

  1. 從 SSH 連線,使用下列命令建立名為 useooziewf.hql的檔案:

    nano useooziewf.hql
    
  2. 在 GNU nano 編輯器開啟之後,請使用下列查詢作為檔案的內容:

    DROP TABLE ${hiveTableName};
    CREATE EXTERNAL TABLE ${hiveTableName}(deviceplatform string, count string) ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t' STORED AS TEXTFILE LOCATION '${hiveDataFolder}';
    INSERT OVERWRITE TABLE ${hiveTableName} SELECT deviceplatform, COUNT(*) as count FROM hivesampletable GROUP BY deviceplatform;
    

    文稿中有兩個變數:

    • ${hiveTableName}:包含要建立的數據表名稱。

    • ${hiveDataFolder}:包含儲存資料表資料檔的位置。

      本文中的工作流程定義檔案workflow.xml,會在運行時間將這些值傳遞至此 HiveQL 腳本。

  3. 若要儲存盤案,請選取 Ctrl+X,輸入 Y,然後選取 Enter

  4. 使用下列命令複製到 useooziewf.hqlwasbs:///tutorials/useoozie/useooziewf.hql

    hdfs dfs -put useooziewf.hql /tutorials/useoozie/useooziewf.hql
    

    此命令會將 useooziewf.hql 檔案儲存在叢集的 HDFS 相容記憶體中。

定義工作流程

Oozie 工作流程定義是以 Hadoop 行程定義語言 (hPDL) 撰寫,這是 XML 行程定義語言。 使用下列步驟來定義工作流程:

  1. 使用以下陳述式建立和編輯新的檔案:

    nano workflow.xml
    
  2. 在 nano 編輯器開啟後,請輸入下列 XML 做為檔案內容:

    <workflow-app name="useooziewf" xmlns="uri:oozie:workflow:0.2">
        <start to = "RunHiveScript"/>
        <action name="RunHiveScript">
        <hive xmlns="uri:oozie:hive-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
            <property>
                <name>mapred.job.queue.name</name>
                <value>${queueName}</value>
            </property>
            </configuration>
            <script>${hiveScript}</script>
            <param>hiveTableName=${hiveTableName}</param>
            <param>hiveDataFolder=${hiveDataFolder}</param>
        </hive>
        <ok to="RunSqoopExport"/>
        <error to="fail"/>
        </action>
        <action name="RunSqoopExport">
        <sqoop xmlns="uri:oozie:sqoop-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>
            <property>
                <name>mapred.compress.map.output</name>
                <value>true</value>
            </property>
            </configuration>
            <arg>export</arg>
            <arg>--connect</arg>
            <arg>${sqlDatabaseConnectionString}</arg>
            <arg>--table</arg>
            <arg>${sqlDatabaseTableName}</arg>
            <arg>--export-dir</arg>
            <arg>${hiveDataFolder}</arg>
            <arg>-m</arg>
            <arg>1</arg>
            <arg>--input-fields-terminated-by</arg>
            <arg>"\t"</arg>
            <archive>mssql-jdbc-7.0.0.jre8.jar</archive>
            </sqoop>
        <ok to="end"/>
        <error to="fail"/>
        </action>
        <kill name="fail">
        <message>Job failed, error message[${wf:errorMessage(wf:lastErrorNode())}] </message>
        </kill>
        <end name="end"/>
    </workflow-app>
    

    工作流程中定義了兩個動作:

    • RunHiveScript:此動作是啟動動作,並執行 useooziewf.hql Hive腳稿。

    • RunSqoopExport:此動作會使用 Sqoop,將從 Hive 腳本建立的數據匯出至 SQL 資料庫。 只有在動作成功時, RunHiveScript 才會執行此動作。

      工作流程有數個專案,例如 ${jobTracker}。 您將以您在作業定義中使用的值取代這些專案。 您稍後會在本檔中建立作業定義。

      另請注意 <archive>mssql-jdbc-7.0.0.jre8.jar</archive> Sqoop 區段中的專案。 此專案會指示 Oozie 在此動作執行時,讓 Sqoop 提供此封存。

  3. 若要儲存盤案,請選取 Ctrl+X,輸入 Y,然後選取 Enter

  4. 使用下列命令將 workflow.xml 檔案複製到 /tutorials/useoozie/workflow.xml

    hdfs dfs -put workflow.xml /tutorials/useoozie/workflow.xml
    

建立表格

注意

有許多方式可以連線到 SQL 資料庫 來建立數據表。 下列步驟會從 HDInsight 叢集使用 FreeTDS

  1. 使用下列命令在 HDInsight 叢集上安裝 FreeTDS:

    sudo apt-get --assume-yes install freetds-dev freetds-bin
    
  2. 編輯下列程式代碼,以邏輯 SQL 伺服器名稱取代 <serverName> ,並以<sqlLogin>伺服器登入取代 。 輸入 命令以連線到必要 SQL 資料庫。 在提示字元中輸入密碼。

    TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
    

    您會收到文字輸出:

    locale is "en_US.UTF-8"
    locale charset is "UTF-8"
    using default charset "UTF-8"
    Default database being set to oozietest
    1>
    
  3. 1> 提示字元中,輸入下列幾行:

    CREATE TABLE [dbo].[mobiledata](
    [deviceplatform] [nvarchar](50),
    [count] [bigint])
    GO
    CREATE CLUSTERED INDEX mobiledata_clustered_index on mobiledata(deviceplatform)
    GO
    

    輸入 GO 陳述式後,將評估先前的陳述式。 這些語句會建立名為 mobiledata的數據表,由工作流程使用。

    若要確認資料表已建立,請使用下列命令:

    SELECT * FROM information_schema.tables
    GO
    

    您會看到類似下列文字的輸出:

    TABLE_CATALOG   TABLE_SCHEMA    TABLE_NAME      TABLE_TYPE
    oozietest       dbo             mobiledata      BASE TABLE
    
  4. 在提示字元中1>輸入 exit ,以結束 tsql 公用程式。

建立作業定義

作業定義描述尋找workflow.xml的位置。 它也會描述在何處尋找工作流程所使用的其他檔案,例如 useooziewf.hql。 此外,它會定義工作流程和相關聯檔案內使用之屬性的值。

  1. 若要取得預設記憶體的完整位址,請使用下列命令。 此位址會用於您在下一個步驟中建立的組態檔中。

    sed -n '/<name>fs.default/,/<\/value>/p' /etc/hadoop/conf/core-site.xml
    

    此指令會傳回類似下列 XML 的資訊:

    <name>fs.defaultFS</name>
    <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net</value>
    

    注意

    如果 HDInsight 叢集使用 Azure 儲存體 做為預設記憶體,元素<value>內容會以 開頭wasbs://。 如果改用 Azure Data Lake 儲存體 Gen1,則其開頭為 adl://。 如果使用 Azure Data Lake 儲存體 Gen2,則其開頭為 abfs://

    儲存專案的內容 <value> ,因為它會在後續步驟中使用。

  2. 編輯下列 xml,如下所示:

    佔位元值 已取代的值
    wasbs://mycontainer@mystorageaccount.blob.core.windows.net 從步驟 1 接收的值。
    管理 如果不是系統管理員,則為 HDInsight 叢集的登入名稱。
    serverName Azure SQL 資料庫 伺服器名稱。
    sqlLogin Azure SQL 資料庫 伺服器登入。
    sqlPassword Azure SQL 資料庫 伺服器登入密碼。
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
        <property>
        <name>nameNode</name>
        <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net</value>
        </property>
    
        <property>
        <name>jobTracker</name>
        <value>headnodehost:8050</value>
        </property>
    
        <property>
        <name>queueName</name>
        <value>default</value>
        </property>
    
        <property>
        <name>oozie.use.system.libpath</name>
        <value>true</value>
        </property>
    
        <property>
        <name>hiveScript</name>
        <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie/useooziewf.hql</value>
        </property>
    
        <property>
        <name>hiveTableName</name>
        <value>mobilecount</value>
        </property>
    
        <property>
        <name>hiveDataFolder</name>
        <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie/data</value>
        </property>
    
        <property>
        <name>sqlDatabaseConnectionString</name>
        <value>"jdbc:sqlserver://serverName.database.windows.net;user=sqlLogin;password=sqlPassword;database=oozietest"</value>
        </property>
    
        <property>
        <name>sqlDatabaseTableName</name>
        <value>mobiledata</value>
        </property>
    
        <property>
        <name>user.name</name>
        <value>admin</value>
        </property>
    
        <property>
        <name>oozie.wf.application.path</name>
        <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie</value>
        </property>
    </configuration>
    

    此檔案中大部分的資訊都用來填入workflow.xml或 ooziewf.hql 檔案中使用的值,例如 ${nameNode}。 如果路徑是 wasbs 路徑,您必須使用完整路徑。 不要將它縮短為。wasbs:/// 項目 oozie.wf.application.path 會定義尋找workflow.xml檔案的位置。 此檔案包含此作業所執行的工作流程。

  3. 若要建立 Oozie 作業定義組態,請使用下列命令:

    nano job.xml
    
  4. 開啟 nano 編輯器之後,將編輯的 XML 貼上為檔案的內容。

  5. 若要儲存盤案,請選取 Ctrl+X,輸入 Y,然後選取 Enter

提交和管理作業

下列步驟使用 Oozie 命令來提交和管理叢集上的 Oozie 工作流程。 Oozie 命令是透過 Oozie REST API 的易記介面

重要

當您使用 Oozie 命令時,您必須針對 HDInsight 前端節點使用 FQDN。 此 FQDN 只能從叢集存取,如果叢集位於 Azure 虛擬網路上,則只能從相同網路上的其他電腦存取。

  1. 若要取得 Oozie 服務的 URL,請使用下列命令:

    sed -n '/<name>oozie.base.url/,/<\/value>/p' /etc/oozie/conf/oozie-site.xml
    

    這會傳回類似下列 XML 的資訊:

    <name>oozie.base.url</name>
    <value>http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie</value>
    

    部分 http://ACTIVE-HEADNODE-NAME.UNIQUEID.cx.internal.cloudapp.net:11000/oozie 是要與 Oozie 命令搭配使用的 URL。

  2. 編輯程式代碼,將URL取代為您稍早收到的URL。 若要建立 URL 的環境變數,請使用下列命令,因此您不需要針對每個命令輸入它:

    export OOZIE_URL=http://HOSTNAMEt:11000/oozie
    
  3. 若要提交作業,請使用下列程序代碼:

    oozie job -config job.xml -submit
    

    此命令會從 job.xml 載入作業資訊,並將其提交至 Oozie,但不會執行。

    命令完成之後,它應該會傳回作業的識別碼,例如 0000005-150622124850154-oozie-oozi-W。 此標識碼是用來管理作業。

  4. 編輯下列程式代碼,以取代 <JOBID> 為上一個步驟中傳回的標識碼。 若要檢視作業的狀態,請使用下列命令:

    oozie job -info <JOBID>
    

    這會傳回如下文字的資訊:

    Job ID : 0000005-150622124850154-oozie-oozi-W
    ------------------------------------------------------------------------------------------------------------------------------------
    Workflow Name : useooziewf
    App Path      : wasb:///tutorials/useoozie
    Status        : PREP
    Run           : 0
    User          : USERNAME
    Group         : -
    Created       : 2015-06-22 15:06 GMT
    Started       : -
    Last Modified : 2015-06-22 15:06 GMT
    Ended         : -
    CoordAction ID: -
    ------------------------------------------------------------------------------------------------------------------------------------
    

    此工作的狀態為 PREP。 此狀態表示已建立作業,但未啟動。

  5. 編輯下列程式代碼,以取代 <JOBID> 為先前傳回的標識碼。 若要啟動作業,請使用下列命令:

    oozie job -start <JOBID>
    

    如果您在此命令之後檢查狀態,則會處於執行中狀態,並傳回作業內動作的資訊。 作業需要幾分鐘的時間才能完成。

  6. 編輯下列程式代碼,以您的伺服器名稱取代 <serverName> ,並以 <sqlLogin> 伺服器登入取代 。 工作順利完成 之後,您可以使用下列命令,確認數據已產生並匯出至 SQL 資料庫數據表。 在提示字元中輸入密碼。

    TDSVER=8.0 tsql -H <serverName>.database.windows.net -U <sqlLogin> -p 1433 -D oozietest
    

    1> 提示字元中,輸入下列查詢:

    SELECT * FROM mobiledata
    GO
    

    傳回的資訊類似下列文字:

    deviceplatform  count
    Android 31591
    iPhone OS       22731
    proprietary development 3
    RIM OS  3464
    Unknown 213
    Windows Phone   1791
    (6 rows affected)
    

如需 Oozie 命令的詳細資訊,請參閱 Apache Oozie 命令行工具

Oozie REST API

使用 Oozie REST API,您可以建置自己的工具來搭配 Oozie 使用。 關於使用 Oozie REST API 的下列 HDInsight 特定資訊:

  • URI:您可以從 叢集 https://CLUSTERNAME.azurehdinsight.net/oozie外部存取 REST API。

  • 驗證:若要進行驗證,請使用 API 叢集 HTTP 帳戶(管理員)和密碼。 例如:

    curl -u admin:PASSWORD https://CLUSTERNAME.azurehdinsight.net/oozie/versions
    

如需如何使用 Oozie REST API 的詳細資訊,請參閱 Apache Oozie Web Services API

Oozie web UI

Oozie Web UI 可讓您用網頁檢視叢集上 Oozie 作業的狀態。 透過 Web UI,您可以檢視下列資訊:

  • 工作狀態
  • 工作定義
  • 組態
  • 作業中動作的圖表
  • 作業的記錄

您也可以檢視作業內動作的詳細數據。

若要存取 Oozie Web UI,請完成下列步驟:

  1. 建立 HDInsight 叢集的 SSH 通道。 如需詳細資訊,請參閱 搭配 HDInsight 使用 SSH 通道。

  2. 建立通道之後,請使用 URI http://headnodehost:8080在網頁瀏覽器中開啟 Ambari Web UI。

  3. 從頁面左側,選取 [Oozie>快速連結>Oozie Web UI]。

    Apache Ambari oozie web ui steps.

  4. Oozie Web UI 預設會顯示執行中的工作流程作業。 若要查看所有工作流程作業,請選取 [所有作業]。

    Oozie web console workflow jobs.

  5. 若要檢視作業的詳細資訊,請選取作業。

    HDInsight Apache Oozie job info.

  6. 從 [ 作業資訊] 索引標籤中,您可以看到作業內的基本作業資訊和個別動作。 您可以使用頂端的索引標籤來檢視 [作業定義]、[作業組態]、存取 [作業記錄檔] 或檢視 [作業 DAG] 底下作業的有向非循環圖 (DAG)。

    • 作業記錄:選取 [ 取得記錄] 按鈕以取得作業的所有記錄,或使用 [輸入搜尋篩選 ] 欄位來篩選記錄。

      HDInsight Apache Oozie job log.

    • 作業 DAG:DAG 是透過工作流程所採用之數據路徑的圖形化概觀。

      `HDInsight Apache Oozie job dag`.

  7. 如果您從 [作業資訊 ] 索引標籤中選取其中一個動作,則會顯示動作的資訊。 例如,選取 RunSqoopExport 動作。

    HDInsight oozie job action info.

  8. 您可以看到動作的詳細數據,例如控制台 URL 的連結。 使用此連結可檢視作業的作業追蹤器資訊。

排程作業

您可以使用協調器來指定作業的開始、結束和發生頻率。 若要定義工作流程的排程,請完成下列步驟:

  1. 使用下列命令來建立名為 coordinator.xml 的檔案:

    nano coordinator.xml
    

    使用下列 XML 做為檔案的內容:

    <coordinator-app name="my_coord_app" frequency="${coordFrequency}" start="${coordStart}" end="${coordEnd}" timezone="${coordTimezone}" xmlns="uri:oozie:coordinator:0.4">
        <action>
        <workflow>
            <app-path>${workflowPath}</app-path>
        </workflow>
        </action>
    </coordinator-app>
    

    注意

    變數 ${...} 會由運行時間作業定義中的值所取代。 變數為:

    • ${coordFrequency}:作業執行實例之間的時間。
    • ${coordStart}:作業開始時間。
    • ${coordEnd}:作業結束時間。
    • ${coordTimezone}:協調器工作位於固定時區,沒有日光節約時間,通常是使用UTC來表示。 這個時區稱為 Oozie 處理時區。
    • ${wfPath}:workflow.xml的路徑。
  2. 若要儲存盤案,請選取 Ctrl+X,輸入 Y,然後選取 Enter

  3. 若要將檔案複製到此作業的工作目錄,請使用下列命令:

    hadoop fs -put coordinator.xml /tutorials/useoozie/coordinator.xml
    
  4. 若要修改您稍早建立的 job.xml 檔案,請使用下列命令:

    nano job.xml
    

    進行下列變更:

    • 若要指示 Oozie 執行協調器檔案,而不是工作流程,請將 變更 <name>oozie.wf.application.path</name><name>oozie.coord.application.path</name>

    • 若要設定 workflowPath 協調器所使用的變數,請新增下列 XML:

      <property>
          <name>workflowPath</name>
          <value>wasbs://mycontainer@mystorageaccount.blob.core.windows.net/tutorials/useoozie</value>
      </property>
      

      wasbs://mycontainer@mystorageaccount.blob.core.windows 文字取代為job.xml檔案中其他專案中使用的值。

    • 若要定義協調器的開始、結束和頻率,請新增下列 XML:

      <property>
          <name>coordStart</name>
          <value>2018-05-10T12:00Z</value>
      </property>
      
      <property>
          <name>coordEnd</name>
          <value>2018-05-12T12:00Z</value>
      </property>
      
      <property>
          <name>coordFrequency</name>
          <value>1440</value>
      </property>
      
      <property>
          <name>coordTimezone</name>
          <value>UTC</value>
      </property>
      

      這些值會將 2018 年 5 月 10 日下午 12:00 開始時間設定為 2018 年 5 月 12 日, 結束時間。 執行此作業的間隔會設定為每日。 頻率以分鐘為單位,因此 24 小時 x 60 分鐘 = 1440 分鐘。 最後,時區會設定為UTC。

  5. 若要儲存盤案,請選取 Ctrl+X,輸入 Y,然後選取 Enter

  6. 若要提交並啟動作業,請使用下列命令:

    oozie job -config job.xml -run
    
  7. 如果您移至 Oozie Web UI 並選取 [協調器作業 ] 索引卷標,您會看到如下圖所示的資訊:

    Oozie web console coordinator jobs tab.

    [ 下一個具體化 ] 專案包含下一次執行作業的時間。

  8. 如同先前的工作流程作業,如果您在 Web UI 中選取作業專案,則會顯示作業的相關信息:

    Apache Oozie coordinator job info.

    注意

    此影像只會顯示作業的成功執行,而不是排程工作流程內的個別動作。 若要查看個別動作,請選取其中一個 動作 專案。

    OOzie web console job info tab.

下一步

在本文中,您已瞭解如何定義 Oozie 工作流程,以及如何執行 Oozie 作業。 若要深入瞭解如何使用 HDInsight,請參閱下列文章: