Azkaban是一款基於Java編寫的任務調度系統java
任務調度:有四個任務腳A、B、C、D,其中任務A與任務B能夠並行運行,而後任務C依賴任務A和任務B的運行結果,任務D依賴任務C的運行結果,此時整個過程能夠等效爲一個有向無環圖,而給全部的任務運行定一個運行規則就能夠理解爲任務調度。mysql
在任務簡單時能夠人爲控制,可是當任務很是多,依賴複雜時,若是沒有清晰的任務規劃圖,很容易在任務之間造成閉環從而出錯,或者多個可並行的任務沒有並行執行而浪費資源,這種時候就須要一個工做流調度器,Azkaban就是完成這種任務的。git
Azkaban分爲三個部分:github
mysql服務器:用於存儲項目、日誌或者執行計劃之類的信息web
web服務器:使用Jetty對外提供web服務,使用戶能夠經過web頁面方便管理sql
executor服務器:負責具體的工做流的提交、執行數據庫
首先可從Azkaban官網上下載azkaban,初學時能夠只下載azkaban-web-server-2.5.0.tar.gz
,azkaban-executor-server-2.5.0.tar.gz
和azkaban-sql-script-2.5.0.tar.gz
三個組件壓縮包便可,下載後進行解壓azkaban-sql-script-2.5.0.tar.gz
包中包含的都是Azkaban所需用到的全部數據庫表的建立語句,在Azkaban 2.5.0版本的這個包中會有一個create-all.sql
文件,能夠一次性建立好全部的數據庫表。azkaban-web-server-2.5.0.tar.gz
解壓後在其conf/azkaban.properties
文件中能夠進行web服務器數據庫鏈接,web訪問方式與端口,web訪問帳號密碼,郵件等設置,各位根據本身的實際狀況進行配置。azkaban-executor-server-2.5.0.tar.gz
解壓後在其conf/azkaban.properties
文件中能夠進行執行服務器數據庫鏈接,執行服務器線程數等設置。bash
在這些都設置好之後,瀏覽器訪問對應IP與端口,便可進入Azkaban的web界面了。此時Azkaban的基礎搭建基本完成。服務器
Azkaban界面中的主要元素有三個,分別是project、job與flow
project能夠理解爲某個項目,其項目中包含了許多須要執行的任務,即爲job,各個job之間造成依賴關係,便組成了工做流flow
在Azkaban系統的web界面中有建立project的交互,能夠經過界面建立一個project,可是Azkaban沒有建立job與flow的界面,這一點很討厭。因而須要編寫以.job
爲擴展名的文件而後上傳,才能在系統中造成job任務。
首先,須要建立以.job
爲擴展名的文件,一個文件即表明一個任務。
全部的job都須要一個知道他們如何去執行的type。通常的,有這樣四種job類型:Java、command、javaprocess和pig。
本文以type=command
爲例
其次在這個文件中添加這個任務所需的參數與參數值,
必須的參數有type
與command
例如
type=commandcommand=echo 'jobs start'
四類job類型的文件均可以添加的參數有retries
--> 任務失敗時自動重啓的次數retry.backoff
--> 每一次任務嘗試重啓時之間等待的毫秒數working.dir
--> 能夠從新指定任務執行的工做目錄,默認爲目前正在運行的任務的工做目錄failure.emails
--> 任務失敗時的郵件提醒設置,以逗號分隔多個郵箱success.emails
--> 任務成功時的郵件提醒設置,以逗號分隔多個郵箱notify.emails
--> 任務不管失敗仍是成功都郵件提醒設置,以逗號分隔多個郵箱dependencies
--> 定義該文件依賴的文件,值爲被依賴文件的文件名,多個目標以逗號分隔,不加擴展名
保存爲start.job
文件即建立好了一個job
Azkaban每一個project中只能上傳一個
.zip
文件
定義好全部的參數後即爲定義好了一個job,若是添加了dependencies
參數即造成了工做流flow
以開頭的任務流爲例:
#start.jobtype=commandcommand=echo "jobs start"
#A.jobtype=commandcommand=echo "This A job"dependencies=start
#B.jobtype=commandcommand=echo "This B job"dependencies=start
#C.jobtype=commandcommand=echo "This C job"dependencies=A,B
#D.jobtype=commandcommand=echo "This D job"dependencies=C
保存好5個文件後,將5文件打包成zip,而後在界面中進行上傳,就會將這幾個job上傳到了系統中,最終呈現
從而一個工做流flow建好。
注意,想多個工做流flow併到一張圖中,必須多個工做流flow有一個公共的結束job文件
Azkaban能夠給每個flow設定定時調度,這樣就能夠等到特定時間運行,然而,這樣依舊不能知足一些需求
例如:
一個整個平臺的任務調度中,大部分的job任務是根據依賴依次進行,可是有某些個job則依然須要本身的運行設定時間,即上一個job完成後須要等待,不能當即執行下一個job,可是Azkaban給job任務單獨設定時後,會覆蓋整個任務流flow的設置,因此此時須要引進子任務流subflow
子任務流的建立須要一個job文件,其參數形式爲
type= xxx flow.name= xxxdependencies= xxx
注意
子流文件的參數設置須要遵循:
flow.name爲設定的子流subflow的結束job文件的文件名
子流內部的起始文件不存在依賴 ,其依賴關係在type=flow這個文件中設定
子流後面的文件的依賴則爲type=flow這個job文件的文件名
因此上面這個例子中
添加一個文件:
#subflow.jobtype=flowflow.name=Cdependencies=start
相應修改文件:
#A.jobtype=commandcommand=echo "This A job"
#B.jobtype=commandcommand=echo "This B job"
#D.jobtype=commandcommand=echo "This D job"dependencies=subflow
此時工做流會變爲
這樣在這個project中,就能夠分別對兩個流進行調度的設定,而且主流中的依賴會等待子流的運行,整體任務調度圖也會很是的清晰
Azkaban自帶有郵件提醒功能,在web服務器的conf/azkaban.properties
文件中,有如下字段
# mail settingsmail.host=mail.sender=mail.user=mail.password=job.failure.email=job.success.email=job.notify.email=
這裏面全部的值都是設定的是郵件的發送者,當初覺得是設定接受者,被坑了很久,而郵件的接受者設置則須要前文所說的job文件的failure.emails
,success.emails
,notify.emails
三個參數,可是這三個屬性不是直接加在.job
文件中,而是須要在全部.job
文件的根目錄下建立一個以.properties
爲擴展名的文件
例如:
# system.propertiessuccess.emails=xxx@xx.com failure.emails=xxx@xx.com
一些其餘須要全局做用的參數也能夠添加在這個文件中,此屬性文件會做用於全局job文件,一塊兒打包上傳便可。這樣就能夠實現任務成功或失敗時的郵件提醒。
Azkaban還能夠自行開發插件,不過這個系統依然有一些bug,若是後續有需求則須要慢慢修補了。