本文由雲+社群發表
作者: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。
Webserver主要負責許可權驗證、專案管理、作業流下發等工作;
Executor主要負責作業流/作業的具體執行以及蒐集執行日誌等工作;
MySQL用於儲存作業/作業流的執行狀態資訊。圖中所示的是單executor場景,但是實際應用中大部分的專案使用的都是多executor場景。
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.github.io/azkaban/doc…
二、Azkaban與數倉叢集的網路互通
目前Azkaban與雲產品Snova網路互通基於兩個事實:1,Azkaban Executor的伺服器能夠訪問外網或者能夠訪問Snova的服務端IP。2,Snova提供外網IP訪問的能力。下圖為網路連通示意圖:
Azkaban Executor在執行執行job時,其指令碼或者命令通過公網IP訪問Snova。
接下來分步驟講解如何基於Azkaban的工作流。
三、前期準備工作
3.1 Snova叢集建立外網IP
在Snova叢集控制檯,基礎配置頁面,點選“申請外網地址”,等待執行成功後,會看到訪問該叢集的外網IP地址。
3.2 新增Snova訪問地址白名單
在Snova控制檯,叢集詳情頁,配置頁,新建白名單如下所示。
為什麼要建這個訪問白名單?
為了系統安全,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;
複製程式碼
四、定時排程任務
登入Azkaban,Create Project=>Upload 上一步生成的zip包 =>execute flow執行一步步操作即可。
具體步驟可以見 參考文件:
4.1 建立工程
4.2 建立job
job1
檔名:job.job,必須以.job結尾。內容如下:
type=command
command=echo "job1"
retries=5
複製程式碼
注:type型別及使用方式見azkaban.github.io/azkaban/doc…
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包中。注意:所有檔案必須在壓縮包的根目錄中,沒有子目錄,如下:
4.3執行
查詢執行過程和結果。
4.4設定週期排程
在除錯成功完成後,可以設定週期排程計劃,比如每天定時進行工作流的排程,完成執行計劃。
五、實踐總結
對市面上最流行的兩種排程器,給出以下詳細對比。知名度比較高的應該是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程式掛掉,該任務將出現狀態失敗的情況,實際可能任務已經執行成功。
此文已由騰訊雲+社群在各渠道釋出
獲取更多新鮮技術乾貨,可以關注我們騰訊雲技術社群-雲加社群官方號及知乎機構號