介紹
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負責根據作業的依賴關系完成作業的解析和調度
安裝步驟
首先准備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
安裝及配置數據庫(目前僅支持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
下載安裝Web Server
- 將azkaban-web-server-2.1.tar.gz解壓到合適目錄,如Azkaban2-web-server-install-dir
解壓完應該有如下文件目錄
Folder Descriptionbin 運行 Azkaban jetty server的腳本conf Azkaban web server的配置文件lib Azkaban依賴的jar包extlib 放入到這個目錄的jar包會被添加Azkaban的classpathplugins 插件安裝在此目錄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 RSAEnter keystore password: passwordWhat is your first and last name?[Unknown]: jetty.mortbay.orgWhat is the name of your organizational unit?[Unknown]: JettyWhat 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]: yesEnter key password for <jetty>(RETURN if same as keystore password): password
成功得到keystore文件后,根據實際情況修改azkaban.properties文件里如下內容
jetty.keystore=keystorejetty.password=passwordjetty.keypassword=passwordjetty.truststore=keystorejetty.trustpassword=password
- 配置數據庫。根據實際情況修改Azkaban2-web-server-install-dir/azkaban.properties文件里如下內容
database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=azkabanmysql.numconnections=100
- 配置UserManager。根據實際情況配置azkaban-users.xml相關信息,其中在azkaban.properties里定義了對azkaban-users.xml的引用
user.manager.class=azkaban.user.XmlUserManageruser.manager.xml.file=conf/azkaban-users.xml
- 運行Web Server
在azkaban.properties中如下屬性配置jetty的相關行為
jetty.maxThreads=25jetty.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 ./
下載安裝Excutor Server
- 將azkaban-executor-server-2.1.tar.gz解壓到合適目錄,如Azkaban2-exec-server-install-dir
解壓完應該有如下文件目錄
Folder Descriptionbin 啟動Azkaban jetty server的腳本conf Azkaban exec server的相關配置文件lib Azkaban依賴的jar包extlib 放入到這個目錄的jar包會被添加Azkaban的classpathplugins 插件安裝在此目錄
- 配置數據庫。根據實際情況修改Azkaban2-exec-server-install-dir/azkaban.properties文件里如下內容
database.type=mysqlmysql.port=3306mysql.host=localhostmysql.database=azkabanmysql.user=azkabanmysql.password=azkabanmysql.numconnections=100
- 配置AzabanWebServer和AzkabanExecutorServer客戶端
在AzkabanExecutorServer的azkaban.properties里做如下配置:
# Azkaban Executor settingsexecutor.maxThreads=50executor.port=12321executor.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
安裝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 Descriptionazkaban.should.proxy Wether Azkaban should proxy as another user to view the hdfs filesystem, rather than Azkaban itself, defaults to truehadoop.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 installationsproxy.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 Descriptionhadoop.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 Descriptionhadoop.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 installationsproxy.keytab.location The location of the keytab file with which Azkaban can authenticate with Kerberos for the specified proxy.userhadoop.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)
使用說明及舉例。Job具體可配置信息可參看http://azkaban.github.io/azkaban2/documents/2.1/jobconf.html
- 建立一個簡單的可以進行定時調度的job
Azkaban啟動后可以使用瀏覽器訪問站點的8443端口,進入站點后可以進行project增刪改查等相關操作。下面以創建一個簡單的Job舉例,比如創建foo.job
# foo.jobtype=commandcommand=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.propertiesHDFSRoot=/testparam.inData=${HDFSRoot}/inputparam.outData=${HDFSRoot}/output
#wordcount.jobtype=hadoopJavajob.class=azkaban.jobtype.examples.java.WordCountclasspath=./lib/*main.args=${param.inData} ${param.outData1}force.output.overwrite=trueinput.path=${param.inData}output.path=${param.outData}
- 郵件的使用首先需要修改Azkaban2-web-server-install-dir/conf/azkaban.properties,示例如下
# mail settingsmail.sender=******@miaozhen.commail.host=smtp.miaozhen.commail.user=******@miaozhen.commail.password=******
然后需要根據每個Job的情況配置合適的郵件通知列表,示例如下
# foo.jobtype=commandcommand=echo "Hello World"notify.emails=******@miaozhen.comfailure.emails=******@miaozhen.comsuccess.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 ContinueHTTP/1.1 200 OKContent-Type: application/jsonContent-Length: 43Server: 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}