介紹css
Azkaban是twitter出的一個任務調度系統,操做比Oozie要簡單不少並且很是直觀,提供的功能比較簡單。Azkaban以Flow爲執行單元進行定時調度,Flow就是預約義好的由一個或多個可存在依賴關係的Job組成的工做流。Azkaban的官方主頁是http://azkaban.github.io/azkaban2/ ,它的的主要特色有下面幾個:html
- 兼容全部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)java
Azkaban主要是解決Hadoop Job的依賴關係,它包括三個組件,組件之間的關係以下圖所示mysql
- Relational Database(MySQL)存儲Azkaban和Job的狀態信息
- AzkabanWebServer經過WebUI的方式處理對project信息的管理,定時調度和監控
- AzkabanExecutorServer負責根據做業的依賴關係完成做業的解析和調度
-
安裝步驟git
首先準備Azkaban相關軟件,其中AzkabanWebServer和AzkabanExecutorServer要安裝到不一樣目錄,下載連接http://azkaban.github.io/azkaban2/downloads.htmlgithub
- 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)web
Azkaban使用MYSQL管理工程、計劃和執行ajax
- 安裝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 Serversql
- 將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 ./
下載安裝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
安裝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)
使用說明及舉例。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 }