Azkaban簡介
Azkaban是一款有LinkedIn開源的任務(wù)調(diào)度系統(tǒng),使用該系統(tǒng)可以完成任務(wù)的定時(shí)調(diào)度,執(zhí)行,任務(wù)分片等操作。
官方是這么介紹的:
zkaban was implemented at LinkedIn to solve the problem of Hadoop job dependencies.We had jobs that needed to run in order, from ETL jobs to data analytics products.
Initially a single server solution, with the increased number of Hadoop users over the years, Azkaban has evolved to be a more robust solution.
azkaban在linkedIn內(nèi)部經(jīng)常被用來作ETL和大數(shù)據(jù)分析相關(guān)的任務(wù)調(diào)度。
相對于我們比較熟悉的crontab命令,azkaban可以認(rèn)為是一種更高級的,能夠支持任務(wù)的分片與自動執(zhí)行,同時(shí)封裝有基于jetty的web ui的這么一款專業(yè)的任務(wù)調(diào)度系統(tǒng)。于此同時(shí),國內(nèi)也有比較著名的當(dāng)當(dāng)網(wǎng)開源的一款任務(wù)調(diào)度系統(tǒng),elasticjob.
不過,相對于azkaban,筆者更喜歡使用azkaban,因?yàn)槠鋡eb ui界面更加直觀,能夠看到不同的job之間的依賴關(guān)系,同這這個(gè)任務(wù)調(diào)度系統(tǒng)也更輕量化。
Azkaban的架構(gòu)
azkaban使用java開發(fā),封裝了jetty作為輕量的web服務(wù)器,使用web ui來操控,web ui能夠直觀地看到不同的任務(wù)之間的依賴關(guān)系,azkaban可以單點(diǎn)部署,也可以雙機(jī)部署,對于一般的情況,單點(diǎn)部署就足夠了。
他的架構(gòu)示意圖官方是這么給出的:

官方是這么介紹的:
Azkaban consists of 3 key components:
Relational Database (MySQL)
AzkabanWebServer
AzkabanExecutorServer
在我們很多工程情況下,webserver 就是 executor server,這樣就是單點(diǎn)部署,同時(shí),需要我們安裝mysql作為持久化的數(shù)據(jù)庫。
Azkaban做什么?
我們用azkaban主要解決的業(yè)務(wù)場景是:
- 對日志等原始數(shù)據(jù)進(jìn)行ETL
- 將ETL后的數(shù)據(jù)存儲起來,可以是mongodb,也可以是hbase等
- 對數(shù)據(jù)進(jìn)行分析
- 任務(wù)完成或失敗通知管理員
這樣,我們就可以利用azkaban來進(jìn)行任務(wù)調(diào)度,主要應(yīng)用場景就是離線計(jì)算了。
在上面,我們已經(jīng)知道了,大數(shù)據(jù)離線計(jì)算相關(guān)內(nèi)容是存在一種依賴關(guān)系的,最簡單的例子是先要ETL,然后才能進(jìn)行分析。
Azkaban可以在我們睡覺的時(shí)候,幫我們完成日志的ETL和自動分析任務(wù)的創(chuàng)建和監(jiān)控,無人值守,方便輕松。
Azkaban安裝
mysql
首先得安裝Mysql,然后配置mysql,下面按照官方的步驟,進(jìn)行修改如下:
首先登錄到mysql shell,然后輸入密碼:
mysql -uroot -p
Create a database for Azkaban. For example:
創(chuàng)建數(shù)據(jù)庫,名為azkaban
mysql> CREATE DATABASE azkaban;
Create a database user for Azkaban. For example:
Example database creation command. The user name doesn’t need to be ‘a(chǎn)zkaban’
創(chuàng)建用戶名和密碼
mysql> CREATE USER 'username'@'%' IDENTIFIED BY 'password';
例如:
CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
Set user permissions on the database.
Create a user for Azkaban if one hasn’t been made, and give the user INSERT, SELECT, UPDATE, DELETE permission on all tables in the Azkaban db.
Replace db, username with the ones created by the previous steps.
設(shè)置權(quán)限
mysql> GRANT all ON <database>.* to '<username>'@'%' WITH GRANT OPTION;
例如:
GRANT all ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
Configure Packet Size may need to be configured.
MySQL may have, by default, a ridiculously low allowable packet size. To increase it, you’ll need to have the property max_allowed_packet set to something higher, say 1024M.
To configure this in linux, open /etc/my.cnf. Somewhere after mysqld, add the following:
配置/etc/my.cnf 文件的參數(shù):
[mysqld]
...
max_allowed_packet=1024M
To restart MySQL, you can run…
重啟服務(wù),配置生效
$ sudo /sbin/service mysqld restart
azkaban安裝
在git上clone一個(gè):
git clone https://github.com/azkaban/azkaban.git
gradle 編譯
這里說明以下,因?yàn)閍zkaban可能會用到node.js的npm,所以如果失敗的話可以安裝下node.js,由于我的server安裝過node.js環(huán)境,我不知道不安裝是否會失敗。
# Build Azkaban
./gradlew build
# Build and install distributions
./gradlew installDist
進(jìn)入到編譯后的文件夾
在azkaban源代碼的根目錄下,注意我說的是源代碼的根目錄下,這個(gè)文件路徑有點(diǎn)兒惡心,別找錯(cuò)了:
cd ./azkaban-solo-server/build/install/azkaban-solo-server
之后這個(gè)路徑我們就是我們相對路徑的參考路徑了,下面稱之為 azkaban-solo-server 目錄,切記!
這個(gè)文件路徑是單機(jī)部署編譯出來的,從solo這個(gè)單詞也能看出來,我們執(zhí)行節(jié)點(diǎn)和web server節(jié)點(diǎn)都是同一個(gè),對于很多情況,這種就足夠了。
配置azkaban
在這個(gè) azkaban-solo-server 目錄下,找到conf目錄,cd進(jìn)去,修改幾個(gè)文件:
azkaban.properties加入以下內(nèi)容
database.type=mysql
mysql.port=3306
mysql.host=localhost
mysql.database=azkaban
mysql.user=azkaban
mysql.password=azkaban
mysql.numconnections=100
這個(gè)是Mysql的配置信息,根據(jù)自己的情況修改
azkaban-users.xml
這個(gè)里面是WEB UI默認(rèn)登錄的用戶名和密碼,看情況改,easy!
默認(rèn)的用戶名和密碼都是azkaban
還有一個(gè)很重要的文件也要修改!
在azkaban-solo-server目錄下,修改相對路徑這個(gè)配置文件
vi ./plugins/jobtypes/commonprivate.properties
加入:
memCheck.enabled=false
因?yàn)?
azkaban默認(rèn)要求機(jī)器是3G及以上的,我們很多情況的vps都達(dá)不到這個(gè)水平,我們必須修改這個(gè)配置,否則任務(wù)將一直為running狀態(tài)!
azkaban運(yùn)行
在在azkaban-solo-server目錄下,運(yùn)行:
./bin/azkaban-solo-start.sh
注意:
一定要在這個(gè)路徑下運(yùn)行,因?yàn)檫@個(gè)shell中很多用的都是相對路徑,如果不在這個(gè)路徑下運(yùn)行,mysql數(shù)據(jù)庫會初始化失敗的喔~
之所以沒用nohup運(yùn)行,是為了看看是不是會報(bào)錯(cuò),如果有報(bào)錯(cuò),后續(xù)根據(jù)異常情況好方便排查!
如果要關(guān)閉任務(wù),也運(yùn)行:
./bin/azkaban-solo-shutdown.sh
任務(wù)提交
web ui的默認(rèn)端口號是8081,通過這個(gè)端口號訪問web ui.
登錄到web ui之后,會有任務(wù)創(chuàng)建,這個(gè)倒是沒什么,就是后面要求Upload一個(gè)任務(wù),這里注意下:
upload的文件是zip壓縮的壓縮包,在壓縮包中可以包含多個(gè)任務(wù),表示任務(wù)文件的擴(kuò)展名是.job
然后,多個(gè)job文件打包在一起,這些job文件的格式是:
eg. demo.job
type=command
#用command來執(zhí)行shell腳本,這個(gè)腳本放到壓縮包里打包,注意路徑
command=sh /job/analysis.sh
dependencies=etl
etl.job
type=command
#這個(gè)command當(dāng)然也可以是python腳本啦
command=python /root/demo/etl.py
#這里也可以是任務(wù)執(zhí)行機(jī)器的絕對路徑
#無依賴
然后,把上面需要的job文件,sh文件等等打成一個(gè)zip壓縮包,上傳,即可看到生成一個(gè)DAG,這個(gè)DAG就是我們要調(diào)度的任務(wù).
web ui一共也沒幾個(gè)按鈕,就那么些功能,剩下的隨便點(diǎn)點(diǎn)就知道都怎么用了~