基於Azkaban的任務定時調度實踐

本文由雲+社區發表

作者:maxluo

一、Azkaban介紹

Azkaban是LinkedIn開源的任務調度框架,類似於JavaEE中的JBPM和Activiti工作流框架。

Azkaban功能和特點:

1,任務的依賴處理。

2,任務監控,失敗告警。

3,任務流的可視化。

4,任務權限管理。

常見的任務調度框架有Apache Oozie、LinkedIn Azkaban、Apache Airflow、Alibaba Zeus,由於Azkaban具有輕量可插拔、友好的WebUI、SLA告警、完善的權限控制、易於二次開發等優點,也得到了廣泛應用。下圖爲Azkaban的架構圖,主要有三部分組成:Azkaban Webserver、Azkaban Executor、 DB。

img

Webserver主要負責權限驗證、項目管理、作業流下發等工作;

Executor主要負責作業流/作業的具體執行以及蒐集執行日誌等工作;

MySQL用於存儲作業/作業流的執行狀態信息。圖中所示的是單executor場景,但是實際應用中大部分的項目使用的都是多executor場景。

img

1.1 作業流執行過程

Azkaban webserver會根據蒐集起來的Executor的狀態選擇一個合適的任務運行節點,並將任務推送給該節點,管理並運行該工作流的所有job。

1.2 部署模式

Azkaban支持三種部署模式,分別用於學習和測試,高可用部署方式。

solo-server模式

DB使用的是一個內嵌的H2,Web Server和Executor Server運行在同一個進程裏。這種模式包含Azkaban的所有特性,但一般用來學習和測試。

two-server模式

DB使用的是MySQL,MySQL支持master-slave架構,Web Server和Executor Server運行在不同的進程中。

分佈式multiple-executor模式

DB使用的是MySQL,MySQL支持master-slave架構,Web Server和Executor Server運行在不同機器上,且有多個Executor Server。

1.3 編譯部署
編譯環境
yum install git 

yum install gcc-c++

yum install java-1.8.0-openjdk-devel
下載源碼&解壓
mkdir –p /data/azkaban/install

cd /data/azkaban

wget https://github.com/azkaban/azkaban/archive/3.42.0.tar.gz

mv 3.42.0.tar.gz azkaban-3.42.0.tar.gz

tar -zxvf azkaban-3.42.0.tar.gz
編譯
cd azkaban-3.42.0

./gradlew build installDist -x test
solo-server模式部署

下面爲了部署測試簡單,採用solo-server模式進行部署。

cd /data/azkaban/install tar -zxvf ../azkaban-3.42.0/azkaban-solo-server/build/distributions/azkaban-solo-server-0.1.0-SNAPSHOT.tar.gz -C .
修改時區
cd /data/azkaban/install/azkaban-solo-server-0.1.0-SNAPSHOT

tzselect #選擇Asia/Shanghai

vim ./conf/azkaban.properties

default.timezone.id=Asia/Shanghai #修改時區
啓動
./bin/azkaban-solo-start.sh

注:啓動/關閉必須進到/data/azkaban/install/azkaban-solo-server-0.1.0-SNAPSHOT/目錄。

登錄

http://ip:port/

監聽端口具體見配置./conf/azkaban.properties:jetty.port=8081

IP爲服務器地址。

用戶名見配置./conf/azkaban-users.xml, 具有admin角色的用戶名是azkaban,密碼是azkaban:

<azkaban-users>
<user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
<user password="metrics" roles="metrics" username="metrics"/>
<role name="admin" permissions="ADMIN"/>
<role name="metrics" permissions="METRICS"/>
</azkaban-users>

詳細配置方法內容見:https://azkaban.github.io/azk...

img

二、Azkaban與數倉集羣的網絡互通

目前Azkaban與雲產品Snova網絡互通基於兩個事實:1,Azkaban Executor的服務器能夠訪問外網或者能夠訪問Snova的服務端IP。2,Snova提供外網IP訪問的能力。下圖爲網絡連通示意圖:

img

Azkaban Executor在執行運行job時,其腳本或者命令通過公網IP訪問Snova。

接下來分步驟講解如何基於Azkaban的工作流。

三、前期準備工作

3.1 Snova集羣創建外網IP

在Snova集羣控制檯,基礎配置頁面,點擊“申請外網地址”,等待運行成功後,會看到訪問該集羣的外網IP地址。

img

3.2 添加Snova訪問地址白名單

在Snova控制檯,集羣詳情頁,配置頁,新建白名單如下所示。

img

爲什麼要建這個訪問白名單?

爲了系統安全,Snova默認情況是拒絕不在白名單的地址或者用戶訪問數據庫。

即配置IP白名單CIDR地址爲xx.xx.xx.xx/xx,包括所有Azkaban Executor的所有IP或者網段。

3.3 用戶授權

3.2章節中,建議單獨創建一個用戶用於SCF的任務調度和計算。因此需要授權該用戶訪問對應數據庫和表的權限。

創建用戶
CREATE USER scf_visit WITH LOGIN PASSWORD 'scf_passwd';

並設置用戶訪問密碼。

數據庫表授權
GRANT ALL on t1 to scf_visit;

四、定時調度任務

http://node1:8081/index

登錄Azkaban,Create Project=>Upload 上一步生成的zip包 =>execute flow執行一步步操作即可。

具體步驟可以見 參考文檔:

https://www.cnblogs.com/qingy...

4.1 創建工程

img

4.2 創建job
job1

文件名:job.job,必須以.job結尾。內容如下:

type=command

command=echo "job1"

retries=5

注:type類型及使用方式見https://azkaban.github.io/azk...

job2
type=command

dependencies=job1

retries=5

command=echo "job2 xx"

command.1=ls –al

注:dependencies爲該job依賴的任務文件名(不包括.job後綴)。如果依賴多個,則以逗號分隔,如job2,job5。

job3
type=command

dependencies=job2,job5

command=sleep 60
job5
type=command

dependencies=job1

command=pwd
job6
type=command

dependencies=job3

command=sh /data/shell/admin.sh psqlx

其中/data/shell/admin.sh ,注意作用可以封裝用戶功能代碼,腳本內容如下,實現讀取表中的數據,並進行打印:

function psqlx() {  result=PGPASSWORD=scf_passwd  psql -h xx.xx.xx.xx  -p xx -U scf_visit   -d postgres <<EOF select * from t1; EOF  echo $result }
4.3上傳job壓縮包

壓縮所有job文件到一個zip包中。注意:所有文件必須在壓縮包的根目錄中,沒有子目錄,如下:

img

img

4.3運行

img

查詢執行過程和結果。

img

4.4設置週期調度

在調試成功完成後,可以設置週期調度計劃,比如每天定時進行工作流的調度,完成運行計劃。

img

五、實踐總結

對市面上最流行的兩種調度器,給出以下詳細對比。知名度比較高的應該是Apache Oozie。

5.1 對比

從功能上來對比

  兩者均可以調度linux命令、mapreduce、spark、pig、java、hive、java程序、腳本工作流任務

  兩者均可以定時執行工作流任務

從工作流定義上來對比

  1、Azkaban使用Properties文件定義工作流

  2、Oozie使用XML文件定義工作流

從工作流傳參上來對比

  1、Azkaban支持直接傳參,例如${input}

  2、Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}

從定時執行上來對比

  1、Azkaban的定時執行任務是基於時間的

  2、Oozie的定時執行任務基於時間和輸入數據

從資源管理上來對比

  1、Azkaban有較嚴格的權限控制,如用戶對工作流進行讀/寫/執行等操作

  2、Oozie暫無嚴格的權限控制

5.2 應用場景

對於數據分析基本上可以概括爲三個步驟: 一、數據導入。二、數據計算。三、數據導出。

三個類型的任務可能是多個併發運行,且任務依賴。因此Azkaban基本上能滿足以上的任務調度管理和運行場景需求。

首先創建一個job1,用於用戶數據導入,比如從cos導入,任務內容執行以下SQL命令。

insert into gp_table select * from cos_table;

數據的導入也可以通過其他導入工具,如DataX將其他數據庫的數據週期性的導入Snova數據倉庫中。因此只需把DataX部署到Azkaban Executor機器對應目錄,並進行調用即可

其次,創建job2,用戶數據計算分析。該步驟可以是多個job多次運行的結果,也可以是併發運行。

最後,可以把計算結果出庫到應用數據庫。

insert into cos_table select * from gp_table;

5.2 不足

1,Azkaban目前Job粒度的失敗重試理解相對複雜,在Projects->Executions找到對應的執行失敗的Id,選擇該執行實例ID,進入詳情,點擊重新運行,則會生成一個全新的工作流實例ID,而不是重新運行原來失敗的實例ID,新的實例ID從失敗的job開始運行,已經成功運行的直接跳過,不再運行。

2,job通過shell命令啓動複雜的程序,shell返回成功,並不代表程序運行成功。

3,job運行管理容錯性不足,當一個job提交一個運行任務後,此時重啓或者executor進程掛掉,該任務將出現狀態失敗的情況,實際可能任務已經運行成功。

此文已由騰訊雲+社區在各渠道發佈

獲取更多新鮮技術乾貨,可以關注我們騰訊雲技術社區-雲加社區官方號及知乎機構號

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