Azkaban 使用問題及解決


1. Azkaban是什么?
Azkaban是由Linkedin公司推出的一個批量工作流任務調度器,主要用於在一個工作流內以一個特定的順序運行一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設置依賴關系,這個依賴關系必須是無環的,否則會被視為無效的工作流。Azkaban使用job配置文件建立任務之間的依賴關系,並提供一個易於使用的web用戶界面維護和跟蹤你的工作流。

在介紹Azkaban之前,我們先來看一下現有的兩個工作流任務調度系統。知名度比較高的應該是Apache Oozie,但是其配置工作流的過程是編寫大量的XML配置,而且代碼復雜度比較高,不易於二次開發。另外一個應用也比較廣泛的調度系統是Airflow,但是其開發語言是Python。由於我們團隊內部使用Java作為主流開發語言,所以選型的時候就被淘汰掉了。我們選擇Azkaban的原因基於以下幾點:

提供功能清晰,簡單易用的Web UI界面
提供job配置文件快速建立任務和任務之間的依賴關系
提供模塊化和可插拔的插件機制,原生支持command、Java、Hive、Pig、Hadoop
基於Java開發,代碼結構清晰,易於二次開發
2. Azkaban的適用場景
實際項目中經常有這些場景:每天有一個大任務,這個大任務可以分成A,B,C,D四個小任務,A,B任務之間沒有依賴關系,C任務依賴A,B任務的結果,D任務依賴C任務的結果。一般的做法是,開兩個終端同時執行A,B,兩個都執行完了再執行C,最后再執行D。這樣的話,整個的執行過程都需要人工參加,並且得盯着各任務的進度。但是我們的很多任務都是在深更半夜執行的,通過寫腳本設置crontab執行。其實,整個過程類似於一個有向無環圖(DAG)。每個子任務相當於大任務中的一個流,任務的起點可以從沒有度的節點開始執行,任何沒有通路的節點之間可以同時執行,比如上述的A,B。總結起來的話,我們需要的就是一個工作流的調度器,而Azkaban就是能解決上述問題的一個調度器。

3. Azkaban架構
Azkaban在LinkedIn上實施,以解決Hadoop作業依賴問題。我們有工作需要按順序運行,從ETL工作到數據分析產品。最初是單一服務器解決方案,隨着多年來Hadoop用戶數量的增加,Azkaban 已經發展成為一個更強大的解決方案。

Azkaban由三個關鍵組件構成:

關系型數據庫(MySQL)
AzkabanWebServer
AzkabanExecutorServer


3.1 關系型數據庫(MySQL)

Azkaban使用數據庫存儲大部分狀態,AzkabanWebServer和AzkabanExecutorServer都需要訪問數據庫。

AzkabanWebServer使用數據庫的原因如下:

項目管理:項目、項目權限以及上傳的文件。
執行流狀態:跟蹤執行流程以及執行程序正在運行的流程。
以前的流程/作業:通過以前的作業和流程執行以及訪問其日志文件進行搜索。
計划程序:保留計划作業的狀態。
SLA:保持所有的SLA規則
AzkabanExecutorServer使用數據庫的原因如下:

訪問項目:從數據庫檢索項目文件。
執行流程/作業:檢索和更新正在執行的作業流的數據
日志:將作業和工作流的輸出日志存儲到數據庫中。
交互依賴關系:如果一個工作流在不同的執行器上運行,它將從數據庫中獲取狀態。
3.2 AzkabanWebServer

AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它負責project管理、用戶登錄認證、定時執行工作流、跟蹤工作流執行進度等一系列任務。同時,它還提供Web服務操作的接口,利用該接口,用戶可以使用curl或其他ajax的方式,來執行azkaban的相關操作。操作包括:用戶登錄、創建project、上傳workflow、執行workflow、查詢workflow的執行進度、殺掉workflow等一系列操作,且這些操作的返回結果均是json的格式。並且Azkaban使用方便,Azkaban使用以.job為后綴名的鍵值屬性文件來定義工作流中的各個任務,以及使用dependencies屬性來定義作業間的依賴關系鏈。這些作業文件和關聯的代碼最終以*.zip的方式通過Azkaban UI上傳到Web服務器上。

3.3 AzkabanExecutorServer

以前版本的Azkaban在單個服務中具有AzkabanWebServer和AzkabanExecutorServer功能,目前Azkaban已將AzkabanExecutorServer分離成獨立的服務器,拆分AzkabanExecutorServer的原因有如下幾點:

某個任務流失敗后,可以更方便的將其重新執行
便於Azkaban升級
AzkabanExecutorServer主要負責具體的工作流的提交、執行,可以啟動多個執行服務器,它們通過mysql數據庫來協調任務的執行。

 

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

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

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

2、Azkaban分為三個部分:

mysql服務器:用於存儲項目、日志或者執行計划之類的信息
web服務器:使用Jetty對外提供web服務,使用戶可以通過web頁面方便管理

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

Azkaban服務器交互圖




3、基礎搭建

首先可從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的基礎搭建基本完成。

4、了解各個元素及其關系

Azkaban界面中的主要元素有三個,分別是project、job與flow
project可以理解為某個項目,其項目中包含了許多需要執行的任務,即為job,各個job之間形成依賴關系,便組成了工作流flow。

5、創建工作 job 與創建工作流 flow

在Azkaban系統的web界面中有創建project的交互,可以通過界面創建一個project,但是Azkaban沒有創建job與flow的界面,這一點很討厭。於是需要編寫以.job為擴展名的文件然后上傳,才能在系統中形成job任務。

5.1、創建job

首先,需要創建以.job為擴展名的文件,一個文件即代表一個任務。

所有的job都需要一個知道他們如何去執行的type。

一般的,有這樣四種job類型:Java、command、javaprocess和pig。

本文以type=command為例

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

type=command

command=echo 'jobs start'

四類job類型的文件都可以添加的參數有

retries --> 任務失敗時自動重啟的次數
retry.backoff --> 每一次任務嘗試重啟時之間等待的毫秒數
working.dir --> 可以重新指定任務執行的工作目錄,默認為目前正在運行的任務的工作目錄
failure.emails --> 任務失敗時的郵件提醒設置,以逗號分隔多個郵箱
success.emails --> 任務成功時的郵件提醒設置,以逗號分隔多個郵箱
notify.emails --> 任務無論失敗還是成功都郵件提醒設置,以逗號分隔多個郵箱
dependencies--> 定義該文件依賴的文件,值為被依賴文件的文件名,多個目標以逗號分隔,不加擴展名
保存為start.job文件即創建好了一個job

Azkaban每個project中只能上傳一個.zip文件

5.2、創建工作流flow

定義好所有的參數后即為定義好了一個job,如果添加了dependencies參數即形成了工作流flow

以開頭的任務流為例:

#start.job
type=command

command=echo "jobs start"

#A.job
type=command
command=echo "This A job"

dependencies=start

#B.job
type=command
command=echo "This B job"

dependencies=start

#C.job
type=command
command=echo "This C job"

dependencies=A,B

#D.job
type=command
command=echo "This D job"

dependencies=C

保存好5個文件后,將5文件打包成zip,然后在界面中進行上傳,就會將這幾個job上傳到了系統中,最終呈現


從而一個工作流flow建好。

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

5.3、創建子工作流subflow及其作用

Azkaban可以給每一個flow設定定時調度,這樣就可以等到特定時間運行,然而,這樣依舊不能滿足一些需求
例如:

一個整個平台的任務調度中,大部分的job任務是根據依賴依次進行,但是有某些個job則依然需要自己的運行設定時間,即上一個job完成后需要等待,不能立即執行下一個job,但是Azkaban給job任務單獨設定時后,會覆蓋整個任務流flow的設置,所以此時需要引進子任務流subflow

子任務流的創建需要一個job文件,其參數形式為

type= xxx
flow.name= xxx

dependencies= xxx

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

flow.name為設定的子流subflow的結束job文件的文件名
子流內部的起始文件不存在依賴 ,其依賴關系在type=flow這個文件中設定

子流后面的文件的依賴則為type=flow這個job文件的文件名

所以上面這個例子中

添加一個文件:

#subflow.job
type=flow
flow.name=C
dependencies=start
相應修改文件:

#A.job
type=command

command=echo "This A job"

#B.job
type=command

command=echo "This B job"

#D.job
type=command
command=echo "This D job"

dependencies=subflow

此時工作流會變為

這樣在這個project中,就可以分別對兩個流進行調度的設定,並且主流中的依賴會等待子流的運行,總體任務調度圖也會非常的清晰

5.4、郵件提醒設置

Azkaban自帶有郵件提醒功能,在web服務器的conf/azkaban.properties文件中,有以下字段

# mail settings
mail.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.properties
success.emails=xxx@xx.com

failure.emails=xxx@xx.com

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM