本文由雲+社區發表html
做者:maxluojava
Azkaban是LinkedIn開源的任務調度框架,相似於JavaEE中的JBPM和Activiti工做流框架。node
Azkaban功能和特色:linux
1,任務的依賴處理。c++
2,任務監控,失敗告警。git
3,任務流的可視化。github
4,任務權限管理。web
常見的任務調度框架有Apache Oozie、LinkedIn Azkaban、Apache Airflow、Alibaba Zeus,因爲Azkaban具備輕量可插拔、友好的WebUI、SLA告警、完善的權限控制、易於二次開發等優勢,也獲得了普遍應用。下圖爲Azkaban的架構圖,主要有三部分組成:Azkaban Webserver、Azkaban Executor、 DB。sql
Webserver主要負責權限驗證、項目管理、做業流下發等工做;shell
Executor主要負責做業流/做業的具體執行以及蒐集執行日誌等工做;
MySQL用於存儲做業/做業流的執行狀態信息。圖中所示的是單executor場景,可是實際應用中大部分的項目使用的都是多executor場景。
1.1 做業流執行過程
Azkaban webserver會根據蒐集起來的Executor的狀態選擇一個合適的任務運行節點,並將任務推送給該節點,管理並運行該工做流的全部job。
Azkaban支持三種部署模式,分別用於學習和測試,高可用部署方式。
DB使用的是一個內嵌的H2,Web Server和Executor Server運行在同一個進程裏。這種模式包含Azkaban的全部特性,但通常用來學習和測試。
DB使用的是MySQL,MySQL支持master-slave架構,Web Server和Executor Server運行在不一樣的進程中。
DB使用的是MySQL,MySQL支持master-slave架構,Web Server和Executor Server運行在不一樣機器上,且有多個Executor Server。
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模式進行部署。
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與雲產品Snova網絡互通基於兩個事實:1,Azkaban Executor的服務器可以訪問外網或者可以訪問Snova的服務端IP。2,Snova提供外網IP訪問的能力。下圖爲網絡連通示意圖:
Azkaban Executor在執行運行job時,其腳本或者命令經過公網IP訪問Snova。
接下來分步驟講解如何基於Azkaban的工做流。
在Snova集羣控制檯,基礎配置頁面,點擊「申請外網地址」,等待運行成功後,會看到訪問該集羣的外網IP地址。
在Snova控制檯,集羣詳情頁,配置頁,新建白名單以下所示。
爲何要建這個訪問白名單?
爲了系統安全,Snova默認狀況是拒毫不在白名單的地址或者用戶訪問數據庫。
即配置IP白名單CIDR地址爲xx.xx.xx.xx/xx,包括全部Azkaban Executor的全部IP或者網段。
在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執行一步步操做便可。
具體步驟能夠見 參考文檔:
文件名:job.job,必須以.job結尾。內容以下:
type=command
command=echo "job1"
retries=5
複製代碼
注:type類型及使用方式見azkaban.github.io/azkaban/doc…
type=command
dependencies=job1
retries=5
command=echo "job2 xx"
command.1=ls –al
複製代碼
注:dependencies爲該job依賴的任務文件名(不包括.job後綴)。若是依賴多個,則以逗號分隔,如job2,job5。
type=command
dependencies=job2,job5
command=sleep 60
複製代碼
type=command
dependencies=job1
command=pwd
複製代碼
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 }
複製代碼
壓縮全部job文件到一個zip包中。注意:全部文件必須在壓縮包的根目錄中,沒有子目錄,以下:
查詢執行過程和結果。
在調試成功完成後,能夠設置週期調度計劃,好比天天定時進行工做流的調度,完成運行計劃。
對市面上最流行的兩種調度器,給出如下詳細對比。知名度比較高的應該是Apache Oozie。
從功能上來對比
二者都可以調度linux命令、mapreduce、spark、pig、java、hive、java程序、腳本工做流任務
二者都可以定時執行工做流任務
從工做流定義上來對比
一、Azkaban使用Properties文件定義工做流
二、Oozie使用XML文件定義工做流
從工做流傳參上來對比
一、Azkaban支持直接傳參,例如${input}
二、Oozie支持參數和EL表達式,例如${fs:dirSize(myInputDir)}
從定時執行上來對比
一、Azkaban的定時執行任務是基於時間的
二、Oozie的定時執行任務基於時間和輸入數據
從資源管理上來對比
一、Azkaban有較嚴格的權限控制,如用戶對工做流進行讀/寫/執行等操做
二、Oozie暫無嚴格的權限控制
對於數據分析基本上能夠歸納爲三個步驟: 1、數據導入。2、數據計算。3、數據導出。
三個類型的任務多是多個併發運行,且任務依賴。所以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;
1,Azkaban目前Job粒度的失敗重試理解相對複雜,在Projects->Executions找到對應的執行失敗的Id,選擇該執行實例ID,進入詳情,點擊從新運行,則會生成一個全新的工做流實例ID,而不是從新運行原來失敗的實例ID,新的實例ID從失敗的job開始運行,已經成功運行的直接跳過,再也不運行。
2,job經過shell命令啓動複雜的程序,shell返回成功,並不表明程序運行成功。
3,job運行管理容錯性不足,當一個job提交一個運行任務後,此時重啓或者executor進程掛掉,該任務將出現狀態失敗的狀況,實際可能任務已經運行成功。
此文已由騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號