Azkaban是一款基於Java編寫的任務調度系統
任務調度:有四個任務腳A、B、C、D,其中任務A與任務B可以並行運行,然後任務C依賴任務A和任務B的運行結果,任務D依賴任務C的運行結果,此時整個過程可以等效爲一個有向無環圖,而給所有的任務運行定一個運行規則就可以理解爲任務調度。
在任務簡單時可以人爲控制,但是當任務非常多,依賴複雜時,如果沒有清晰的任務規劃圖,很容易在任務之間形成閉環從而出錯,或者多個可並行的任務沒有並行執行而浪費資源,這種時候就需要一個工作流調度器,Azkaban就是完成這種任務的。
Azkaban分爲三個部分:
mysql服務器:用於存儲項目、日誌或者執行計劃之類的信息
web服務器:使用Jetty對外提供web服務,使用戶可以通過web頁面方便管理
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
文件中可以進行執行服務器數據庫連接,執行服務器線程數等設置。
在這些都設置好以後,瀏覽器訪問對應IP與端口,即可進入Azkaban的web界面了。此時Azkaban的基礎搭建基本完成。
瞭解各個元素及其關係
Azkaban界面中的主要元素有三個,分別是project、job與flow
project可以理解爲某個項目,其項目中包含了許多需要執行的任務,即爲job,各個job之間形成依賴關係,便組成了工作流flow
創建工作 job 與創建工作流 flow
在Azkaban系統的web界面中有創建project的交互,可以通過界面創建一個project,但是Azkaban沒有創建job與flow的界面,這一點很討厭。於是需要編寫以.job
爲擴展名的文件然後上傳,才能在系統中形成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
文件
創建工作流flow
定義好所有的參數後即爲定義好了一個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文件
創建子工作流subflow及其作用
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
爲擴展名的文件
例如:
# [email protected] [email protected]
一些其他需要全局作用的參數也可以添加在這個文件中,此屬性文件會作用於全局job文件,一起打包上傳即可。這樣就可以實現任務成功或失敗時的郵件提醒。
最後
Azkaban還可以自行開發插件,不過這個系統依然有一些bug,如果後續有需求則需要慢慢修補了。