什麼是Azkaban


Azkaban是一款基於Java編寫的任務調度系統

任務調度:有四個任務腳A、B、C、D,其中任務A與任務B可以並行運行,然後任務C依賴任務A和任務B的運行結果,任務D依賴任務C的運行結果,此時整個過程可以等效爲一個有向無環圖,而給所有的任務運行定一個運行規則就可以理解爲任務調度。

在任務簡單時可以人爲控制,但是當任務非常多,依賴複雜時,如果沒有清晰的任務規劃圖,很容易在任務之間形成閉環從而出錯,或者多個可並行的任務沒有並行執行而浪費資源,這種時候就需要一個工作流調度器,Azkaban就是完成這種任務的。

Azkaban分爲三個部分:

  1. mysql服務器:用於存儲項目、日誌或者執行計劃之類的信息

  2. web服務器:使用Jetty對外提供web服務,使用戶可以通過web頁面方便管理

  3. executor服務器:負責具體的工作流的提交、執行

Azkaban服務器交互圖

基礎搭建

首先可從Azkaban官網上下載azkaban,初學時可以只下載
azkaban-web-server-2.5.0.tar.gzazkaban-executor-server-2.5.0.tar.gzazkaban-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爲例

其次在這個文件中添加這個任務所需的參數與參數值,
必須的參數有typecommand
例如

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上傳到了系統中,最終呈現

1240

從而一個工作流flow建好。

注意,想多個工作流flow併到一張圖中,必須多個工作流flow有一個公共的結束job文件

創建子工作流subflow及其作用

Azkaban可以給每一個flow設定定時調度,這樣就可以等到特定時間運行,然而,這樣依舊不能滿足一些需求
例如:
一個整個平臺的任務調度中,大部分的job任務是根據依賴依次進行,但是有某些個job則依然需要自己的運行設定時間,即上一個job完成後需要等待,不能立即執行下一個job,但是Azkaban給job任務單獨設定時後,會覆蓋整個任務流flow的設置,所以此時需要引進子任務流subflow
子任務流的創建需要一個job文件,其參數形式爲

type= xxx
flow.name= xxxdependencies= xxx

注意
子流文件的參數設置需要遵循:

  1. flow.name爲設定的子流subflow的結束job文件的文件名

  2. 子流內部的起始文件不存在依賴 ,其依賴關係在type=flow這個文件中設定

  3. 子流後面的文件的依賴則爲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

此時工作流會變爲

1240

這樣在這個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.emailssuccess.emailsnotify.emails三個參數,但是這三個屬性不是直接加在.job文件中,而是需要在所有.job文件的根目錄下創建一個以.properties爲擴展名的文件
例如:

[email protected]
[email protected]

一些其他需要全局作用的參數也可以添加在這個文件中,此屬性文件會作用於全局job文件,一起打包上傳即可。這樣就可以實現任務成功或失敗時的郵件提醒。

最後

Azkaban還可以自行開發插件,不過這個系統依然有一些bug,如果後續有需求則需要慢慢修補了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章