hadoop工作流引擎之azkaban [轉]


介紹

Azkaban是twitter出的一個任務調度系統,操作比Oozie要簡單很多而且非常直觀,提供的功能比較簡單。Azkaban以Flow為執行單元進行定時調度,Flow就是預定義好的由一個或多個可存在依賴關系的Job組成的工作流。Azkaban的官方主頁是http://azkaban.github.io/azkaban2/ ,它的的主要特點有下面幾個:

  • 兼容所有Hadoop版本(1.x,2.x,CDH)
  • 可以通過WebUI進行管理配置,操作方便
  • 可以通過UI配置定時調度
  • 擴展性好,可針對某一問題開發組件(目前有三個插件HDFSBrowser,JobtypePlugins和HadoopSecurityManager)
  • 有權限管理模塊
  • 可以通過WebUI跟蹤Flow或者Job的執行情況
  • 可以設置郵件提醒
  • 可以為定時Flow或者Flow中的某個Job配置執行時間長度的控制,如果執行時間超過了所設的時間,可以發送警告郵件給相關人員或者Kill掉相應設置的Flow或Job
  • 可以重試失敗Job

Azkaban也有一些局限性(尚待挖掘),例如任務之間的依賴,不能夠指定部分完成(比如我們希望任務A依賴於B,但是並不是B完全執行完成A才可以啟動,而是B的某個階段完成的話就可以啟動A)

Azkaban主要是解決Hadoop Job的依賴關系,它包括三個組件,組件之間的關系如下圖所示

  • Relational Database(MySQL)存儲Azkaban和Job的狀態信息
  • AzkabanWebServer通過WebUI的方式處理對project信息的管理,定時調度和監控
  • AzkabanExecutorServer負責根據作業的依賴關系完成作業的解析和調度
Edit

安裝步驟

首先准備Azkaban相關軟件,其中AzkabanWebServer和AzkabanExecutorServer要安裝到不同目錄,下載鏈接http://azkaban.github.io/azkaban2/downloads.html

  • azkaban-web-server-2.1.tar.gz
  • azkaban-executor-server-2.1.tar.gz
  • azkaban-sql-script-2.1.tar.gz
  • azkaban-hdfs-viewer-2.1.tar.gz
  • azkaban-jobtype-2.1.tar.gz
Edit

安裝及配置數據庫(目前僅支持Mysql)

Azkaban使用MYSQL管理工程、計划和執行

  • 安裝Mysql 具體安裝過程可參考相關資料,比如http://ifalone.me/305.html ,http://dev.mysql.com/doc/index.html
  • 為Azkaban創建數據庫,其中數據庫名字不一定是azkaban
    mysql> CREATE DATABASE azkaban;
  • 創建Azkaban數據庫的用戶,其中用戶名字不一定是azkaban
    mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';
  • 增加azkaban用戶對azkaban數據庫的增刪改查權限 
    mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON <database>.* to '<username>'@'%' WITH GRANT OPTION;
  • 有必要的話可以增加Packet大小,此項限制mysql接受的數據包大小,可以在/etc/my.cnf中配置
    [mysqld]
    ...
    max_allowed_packet=1024M
  • 配置完重啟MYSQL
    sudo /sbin/service mysqld restart
  • 創建Azkaba需要的數據庫表,將azkaban-sql-script-2.1.tar.gz解壓,執行create-all-sql腳本即可(其中帶有‘_update_’的腳本可以忽視)
  • 獲取JDBC連接器mysql-connector-java-5.1.25.tar.gz,下載地址http://dev.mysql.com/downloads/connector/j/ 。mysql-connector-java-5.1.25.tar.gz需要在webserver和excutorserver安裝完后,分別拷入Azkaban2-web-server-install-dir/extlib和supertool/azkaban/excutorserver/extlib
Edit

下載安裝Web Server

  • 將azkaban-web-server-2.1.tar.gz解壓到合適目錄,如Azkaban2-web-server-install-dir
    解壓完應該有如下文件目錄
    Folder    Description
    bin       運行 Azkaban jetty server的腳本
    conf      Azkaban web server的配置文件
    lib       Azkaban依賴的jar包
    extlib    放入到這個目錄的jar包會被添加Azkaban的classpath
    plugins   插件安裝在此目錄
    web       Azkaban web server的相關css,html等文件
  • 獲取SSL需要的keystore。此處尤其注意要用java的keytool工具,不然會報錯(PATH最好將新填的內容放在舊的前面,如PATH=$JAVA_HOME/bin:......:${PATH})
    證書制作可參考http://wingware.iteye.com/blog/1160396 ,http://docs.codehaus.org/display/JETTY/How+to+configure+SSL
    keytool -keystore keystore -alias jetty -genkey -keyalg RSA

    示例如下
    keytool -keystore keystore -alias jetty -genkey -keyalg RSA
    Enter keystore password:  password
    What is your first and last name?
      [Unknown]:  jetty.mortbay.org
    What is the name of your organizational unit?
      [Unknown]:  Jetty
    What is the name of your organization?
      [Unknown]:  Mort Bay Consulting Pty. Ltd.
    What is the name of your City or Locality?
      [Unknown]:
    What is the name of your State or Province?
      [Unknown]:
    What is the two-letter country code for this unit?
      [Unknown]:
    Is CN=jetty.mortbay.org, OU=Jetty, O=Mort Bay Consulting Pty. Ltd.,
    L=Unknown, ST=Unknown, C=Unknown correct?
      [no]:  yes
     
    Enter key password for <jetty>
            (RETURN if same as keystore password):  password

    成功得到keystore文件后,根據實際情況修改azkaban.properties文件里如下內容
    jetty.keystore=keystore
    jetty.password=password
    jetty.keypassword=password
    jetty.truststore=keystore
    jetty.trustpassword=password
  • 配置數據庫。根據實際情況修改Azkaban2-web-server-install-dir/azkaban.properties文件里如下內容
    database.type=mysql
    mysql.port=3306
    mysql.host=localhost
    mysql.database=azkaban
    mysql.user=azkaban
    mysql.password=azkaban
    mysql.numconnections=100
  • 配置UserManager。根據實際情況配置azkaban-users.xml相關信息,其中在azkaban.properties里定義了對azkaban-users.xml的引用
        user.manager.class=azkaban.user.XmlUserManager
        user.manager.xml.file=conf/azkaban-users.xml
  • 運行Web Server
    在azkaban.properties中如下屬性配置jetty的相關行為
    jetty.maxThreads=25
    jetty.ssl.port=8443

    運行前首先要建一個Web Server臨時目錄,如Azkaban2-web-server-install-dir/tmpdir。然后進入webserver/bin目錄,修改azkaban-web-start.sh里的如下內容
    tmpdir=Azkaban2-web-server-install-dir/tmpdir

    進入webserver根目錄執行如下命令,沒意外的話正常啟動。可通過https:/localhost:8443驗證是否啟動成功
    bin/azkaban-web-start.sh ./

    關閉webserver命令如下:
    bin/azkaban-web-shutdown.sh ./
Edit

下載安裝Excutor Server

  • 將azkaban-executor-server-2.1.tar.gz解壓到合適目錄,如Azkaban2-exec-server-install-dir
    解壓完應該有如下文件目錄
    Folder      Description
    bin         啟動Azkaban jetty server的腳本
    conf        Azkaban exec server的相關配置文件
    lib         Azkaban依賴的jar包
    extlib      放入到這個目錄的jar包會被添加Azkaban的classpath
    plugins     插件安裝在此目錄
  • 配置數據庫。根據實際情況修改Azkaban2-exec-server-install-dir/azkaban.properties文件里如下內容
    database.type=mysql
    mysql.port=3306
    mysql.host=localhost
    mysql.database=azkaban
    mysql.user=azkaban
    mysql.password=azkaban
    mysql.numconnections=100
  • 配置AzabanWebServer和AzkabanExecutorServer客戶端
    在AzkabanExecutorServer的azkaban.properties里做如下配置:
    # Azkaban Executor settings
    executor.maxThreads=50
    executor.port=12321
    executor.flow.threads=30

    在AzkabanWebServer的azkaban.properties里做如下配置:
    executor.port=12321

    這個配置需要重啟Server才能生效
  • 運行Excutor Server
    運行前首先要建一個Excutor Server臨時目錄,如supertool/azkaban/excutorserver/tmpdir。然后進入excutorserver/bin目錄,修改azkaban-web-start.sh里的如下內容
    tmpdir=supertool/azkaban/excutorserver/tmpdir

    進入excutorserver根目錄執行如下命令,沒意外的話正常啟動
    bin/azkaban-exec-start.sh ./

    關閉運行如下命令
    bin/azkaban-exec-shutdown.sh
Edit

安裝Azkaban插件

  • HDFS Viewer插件
    修改Azkaban2-web-server-install-dir/conf/azkaban.properties:
    viewer.plugins=hdfs

    Azkaban 會從如下地址加載hdfs viewer插件:
    Azkaban2-web-server-install-dir/plugins/viewer/hdfs

    將azkaban-hdfs-viewer-2.1.tar.gz解壓到Azkaban2-web-server-install-dir/plugins/viewer並將目錄重命名為hdfs
    *如果hadoop沒有啟動安全機制,重啟AzkabanWebServer 即可使用hdfs插件。如果hadoop啟動了安全機制,則需要修改Azkaban2-web-server-install-dir/plugins/viewer/hdfs/conf/plugin.properties里的如下配置:
    Parameter                          Description
    azkaban.should.proxy               Wether Azkaban should proxy as another user to view the hdfs filesystem, rather than Azkaban itself, defaults to true
    hadoop.security.manager.class      The security manager to be used, which handles talking to secure hadoop cluster, defaults to azkaban.security.HadoopSecurityManager_H_1_0 (for hadoop 1.x versions)
    proxy.user                         The Azkaban user configured with kerberos and hadoop. Similar to how oozie should be configured, for secure hadoop installations
    proxy.keytab.location              The location of the keytab file with which Azkaban can authenticate with Kerberos for the specified proxy.user
  • Job Type插件
    修改Azkaban2-exec-server-install-dir/conf/azkaban.properties :
    azkaban.jobtype.plugin.dir=plugins/jobtypes

    Azkaban 會從如下地址加載所有的job types插件:
    Azkaban2-exec-server-install-dir/plugins/jobtypes

    將azkaban-jobtype-2.1.tar.gz解壓到Azkaban2-exec-server-install-dir/plugins/並將目錄重命名為jobtypes
    如果hadoop沒有啟動安全機制,只需要修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties中如下配置:
    Parameter                           Description
    hadoop.home                         Your $HADOOP_HOME setting.
    jobtype.global.classpath            The cluster specific hadoop resources, such as hadoop-core jar, and hadoop conf (e.g. ${hadoop.home}/hadoop-core-1.0.4.jar,${hadoop.home}/conf)

    如果hadoop啟動了安全機制,則需要修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties中如下配置:
    Parameter                           Description
    hadoop.security.manager.class       The security manager to be used, which handles talking to secure hadoop cluster, defaults to azkaban.security.HadoopSecurityManager_H_1_0 (for hadoop 1.x versions)
    proxy.user                          The Azkaban user configured with kerberos and hadoop. Similar to how oozie should be configured, for secure hadoop installations
    proxy.keytab.location               The location of the keytab file with which Azkaban can authenticate with Kerberos for the specified proxy.user
    hadoop.home                         Your $HADOOP_HOME setting.
    jobtype.global.classpath            The cluster specific hadoop resources, such as hadoop-core jar, and hadoop con (e.g. ${hadoop.home}/hadoop-core-1.0.4.jar,${hadoop.home}/conf)
Edit

使用說明及舉例。Job具體可配置信息可參看http://azkaban.github.io/azkaban2/documents/2.1/jobconf.html

  • 建立一個簡單的可以進行定時調度的job
    Azkaban啟動后可以使用瀏覽器訪問站點的8443端口,進入站點后可以進行project增刪改查等相關操作。下面以創建一個簡單的Job舉例,比如創建foo.job
    # foo.job
    type=command
    command=echo "Hello World"

    將foo.job壓縮成zip格式。然后在web頁面創建工程並將foo.zip上傳到foo對應工程中,如下圖所示

    配置完成后可以立即執行此project,也可以設置定時執行,定時配置如下示例如下圖。目前時間只能按照UTC和PDT兩種時區輸入,也就是說要根據當地時間先算UTC時間然后再輸入(比如CST-8=UTC,github上已經將此情況列為bug,但是還沒修復)。
  • 建立一個有依賴關系的job
    分別建立foo和bar兩個job,其中bar依賴foo。將兩個job壓縮到一個zip里就生成了一個簡單的flow project,其中foo失敗后的動作可選,具體可參考http://azkaban.github.io/azkaban2/documents/2.1/executingflow.html 。
#foo.job
type=command
command=echo foo
#bar.job
type=command
dependencies=foo
command=echo bar
  • 建立一個HadoopJava類型的Job,主要流程是先把寫好的Java程序打成Jar包,然后配置**.job文件,最后將Jar包和**.job壓縮到zip文件中上傳。一個打包好的有依賴關系的zip包示例http://redmine.mzsvn.com/attachments/download/398/java-hadooptest-de.zip
    首先修改Azkaban2-exec-server-install-dir/plugins/jobtypes/common.properties
    hadoop.home=hadoop.home=/home/workspace/hadoop-*.*.*

    然后修改Azkaban2-exec-server-install-dir/plugins/jobtypes/commonprivate.properties
    jobtype.global.classpath=${hadoop.home}/hadoop-core-*.*.*.jar,${hadoop.home}/conf,${hadoop.home}/lib/*

    一個示例Job如下,其中wc.properties(可選,非必須)描述了此Job的變量信息,wordcount.job描述了此Job的主要配置信息
    #wc.properties
    HDFSRoot=/test
    param.inData=${HDFSRoot}/input
    param.outData=${HDFSRoot}/output

    #wordcount.job
    type=hadoopJava
    job.class=azkaban.jobtype.examples.java.WordCount
    classpath=./lib/*
    main.args=${param.inData} ${param.outData1}
    force.output.overwrite=true
    input.path=${param.inData}
    output.path=${param.outData}
  • 郵件的使用首先需要修改Azkaban2-web-server-install-dir/conf/azkaban.properties,示例如下
    # mail settings
    mail.sender=******@miaozhen.com
    mail.host=smtp.miaozhen.com
    mail.user=******@miaozhen.com
    mail.password=******

    然后需要根據每個Job的情況配置合適的郵件通知列表,示例如下
    # foo.job
    type=command
    command=echo "Hello World"
    notify.emails=******@miaozhen.com
    failure.emails=******@miaozhen.com
    success.emails=******@miaozhen.com
  • Azkaban的SLA使用
    Azkaban可以為定時Flow或者Flow中的某個Job設置SLA服務,如果執行時間超過了所設的時間,可以發送警告郵件給相關人員或者Kill掉相應設置的Flow或Job,示例如下圖。
    • Azkaban的接口調用
      Azkaban對外提供了Ajax接口,此類接口可通過包裝get或者post請求調用。API使用時需要先獲取SessionId(默認有效期一天),然后才可以做其他操作。其中獲取Session到執行Job的過程示例如下
      獲取Session命令:
      curl -k --data "action=login&username=azkaban&password=azkaban" https://localhost:8443
      命令返回結果:
      {
        "status" : "success",
        "session.id" : "5a932706-3d04-4c44-888d-5afcd87b8ebe"
      }

      創建一個Project命令:
      curl -k --data "action=create&name=azkaban&description=dis&session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe" https://localhost:8443/manager
      命令返回結果:
      {"status":"success","path":"manager?project=azkaaban","action":"redirect"}

      上傳打包好的zip壓縮包命令:
      curl -k -i -H "Content-Type: multipart/mixd" -X POST --form 'session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe' --form 'ajax=upload' --form 'file=@foo.job.zip;type=application/zip' --form 'project=MyProject;type/plain' https://localhost:8443/manager
      命令返回結果:
      HTTP/1.1 100 Continue
       
      HTTP/1.1 200 OK
      Content-Type: application/json
      Content-Length: 43
      Server: Jetty(6.1.26)
       
      {
        "projectId" : "42",
        "version" : "1"
      }

      執行Flow命令:
      curl -k --data "ajax=executeFlow&project=azkaban&flow=foo&session.id=5a932706-3d04-4c44-888d-5afcd87b8ebe" https://localhost:8443/executor
      命令返回結果:
      {
        "message" : "Execution submitted successfully with exec id 70",
        "project" : "azkaban",
        "flow" : "foo",
        "execid" : 70
      }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM