一、Azkaban是什麼
咱們在工做中應該都遇到過這樣的場景:有一個任務,這個任務能夠劃分紅多個較小的任務完成,之因此進行劃分是由於小任務之間能夠併發的進行,例如是一個shell腳本執行的命令吧,大任務A能夠劃分紅B、C、D、E四個子任務(腳本)完成,而B和C是能夠同時進行的,D依賴B和C的輸出,E又依賴D的輸出,因而咱們通常的作法可能就是開兩個終端同時執行B和C,等兩個都執行完成以後再執行D,接着在執行E。整個執行的過程都須要咱們參與,可是整個的執行過程相似一個有向無環圖,每個子任務的執行能夠看做整個任務的一個流,咱們能夠同時從沒有入度的節點開始執行,任何沒有流向(兩個節點之間沒有通路)關係節點均可以並行得執行,人爲的控制不免就有點力不從心了(由於不少任務都須要在深夜執行,通常咱們都是寫腳本並設置cron),這時候咱們須要的就是一個工做流調度器。 Azkaban就是完成這種任務的(其實主要仍是用於對hadoop生態圈的任務的支持),它是由Linkedin實現並開源的,主要用於在一個工做流內以一個特定的順序運行一組工做和流程,它的配置是經過簡單的key:value對的方式,經過配置中的dependencies來設置依賴關係,這個依賴關係必須是無環的,不然會被視爲無效的工做流。 Azkaban有以下功能特色:html
我以爲這些都是一些主流的工做流調度器應該支持的功能,我以爲azkaban的web頁面作得比較好,這樣能夠大大下降管理成本,它支持的任務調度類型是基於插件的,這也就使得咱們能夠實現本身的插件來完成特定的需求。另外,它還可以在任務完成、失敗、成功的時候發送email,支持SLA設置等功能,整體來講,功能仍是很強大的。
二、安裝部署
azkaban分爲三個組建:mysql服務器、web服務器和executor服務器,其中mysql用於存儲一些項目以及執行計劃(全部任務的屬性信息、執行計劃、執行的結果以及輸出),每次執行狀況等信息;web服務器使用Jetty對外提供web服務,是用戶能夠經過web頁面方便的管理;執行服務器是負責具體的工做流的提交,執行,能夠啓動多個執行服務器,它們經過mysql數據庫來協調任務的執行。java
首先須要從官網上下載各個模塊,都是二進制的安裝包格式,固然也可使用源碼編譯,下載地址:http://azkaban.github.io/downloads.html 接下來的安裝過程能夠參考:http://blog.javachen.com/2014/08/25/install-azkaban/ 由於web客戶端是經過https的方式進行訪問的,因此這裏須要建立一個keystore證書文件,使用命令:keytool -keystore keystore -alias jetty -genkey -keyalg RSA,按照提示輸入須要的信息,最後輸入的」輸入 <jetty> 的密鑰口令「能夠和密鑰庫口令同樣,而且須要在web服務器的配置文件azkaban.properties中修改Jetty服務器的屬性,其中 jetty.keystore=keystore jetty.password=redhat jetty.keypassword=redhat jetty.truststore=keystore jetty.trustpassword=redhat 設置爲你生成的證書文件的信息。接着就能夠在瀏覽器中輸入https://ip:8443訪問azkaban了(登陸的用戶名和密碼是在web服務器的user配置文件中設置的,這裏咱們使用的是admin)。 python
三、測試
這裏咱們進行簡單的測試,因爲azkaban原生是支持shell命令(因此也就能夠支持shell腳本以及python等其餘腳本程序)的,因此可使用簡單的shell命令進行測試,咱們建立4個子任務,每個子任務的配置都是任務名.job文件。它們的配置以下: test.job
type=command
command=sleep 3
command.1=echo "Hello World"
start.job
type=command
command=sleep 5
command.1=echo "start execute"
sleep.job
type=command
dependencies=test, start
command=sleep 10
finish.job
type=command
dependencies=sleep
command=echo "finish" 這裏經過dependencies屬性來標識該任務依賴的任務,能夠有一個或者多個,經過","分割,這些任務的type都是command,azkaban也支持其它類型的命令類型,有些須要安裝插件才能支持。 而後咱們將這四個job文件放在一個目錄下壓縮成一個zip文件,在Azkaban的web界面的首頁能夠經過」Create Project「按鈕來建立新的一個工做流,輸入必要的信息以後會進入到project界面,咱們能夠經過upload上傳咱們要執行的任務流,能夠重複upload進行覆蓋。可是以前的任務流的執行結果不會被覆蓋。若是工做流的配置有問題(例如出現相互依賴),上傳會不成功,可是沒有看到提示。等待壓縮文件上傳成功以後,咱們能夠經過界面查看各個任務的依賴關係圖:mysql
能夠經過」Execute Flow「按鈕來啓動一個工做流的一次執行,點擊以後會進入配置界面,包括其中包括」Flow View「、」Notification「、」Failure Options「、」Concurrent「、」Flow Parameters「,另外還須要注意的是左下角的Schedule按鈕,這裏能夠設置工做流的定時執行。注意,這裏是每一次工做流執行的時候都須要設置的,目前沒有看到保存歷史設置的狀況,固然若是但願重複以前執行的一次設置的話能夠找到以前的那次執行,而後再次運行(這時候仍是須要進入配置頁面,可是會保存那次運行的配置)。其中須要注意的是在」Failure Options「和」Concurrent「中的配置,他們分別配置了在工做流中一個任務執行失敗以後的處理和這個project的屢次執行流(屢次Execute)若是存在並行時的處理。咱們在這裏不進行配置,直接執行命令: 提交以後會提示本次執行的id(我以爲這裏經過一個可識別的字符串進行標示會更好一些),這個id是全局惟一的,也就是說多個project的每一次執行都會遞增獲得新的exec id。 執行完成以後,能夠經過web界面查看每個任務流的執行結果以及每個子任務的執行結果。git
在Graph標籤下能夠查看每個任務執行的狀況、當前執行到哪個任務了,Flow Log中會實時得輸出工做流的運行日誌,點擊每個子任務能夠查看子任務的運行狀態以及實時輸出的日誌信息,整體來講仍是很是方便的。
這裏涉及的幾個概念:project、flow和job,首先一個project是一個要執行任務的總體,它能夠包含多個flow,每個project能夠上傳一個.zip的文件,flow之間是相互獨立的,可是有一個總的flow,這個flow可能引用其餘的flow做爲它執行的一部分(至關於總flow的一個子job,可是這個job是一個flow)。每個flow包含多個job,這些job是相互獨立的,經過job文件中dependencies設置依賴關係,每個flow的結束job能夠做爲這個flow的標識(flow名),咱們能夠經過這樣的方式將一個flow做爲一個job加入到另外的flow中: jobGroup.job type=flow
flow.name=finish
dependencies=realStart finish是以前定義的flow的標識(由於它是終止job),這個flow做爲一個job能夠設置其餘的依賴關係,下面是一個包含子flow的任務依賴圖:github
我以爲之因此要設計成這樣是爲了將每一個flow獨立出來,方便flow的重用。
四、用戶管理
azkaban中有用戶和用戶組的概念,用戶和用戶組以及權限的配置信息保存在配置文件azkaban-users.xml中,認證的方式是由azkaban.user.XmlUserManager來實現的,具體的配置能夠在azkaban.properties(web服務器的conf下)進行配置:web
Parameter | Default |
---|---|
user.manager.class | azkaban.user.XmlUserManager |
user.manager.xml.file | azkaban-users.xml |
咱們在azkaban-users.xml能夠配置三類內容:user、group和role,user項能夠配置username、password、roles、group信息,分別配置用戶名、密碼、用戶的權限以及所屬的組;group項能夠配置name和roles,分別用於配置組名和這個組使用的權限;role定義了權限信息,能夠配置name和permissions,分別表示規則名和賦予的權限信息。azkaban支持的權限包括:sql
Permissions | Values |
---|---|
ADMIN | 能夠作任務事情,包括給其餘用戶添加、修改權限 |
READ | 只能訪問每個project的內容和日誌信息 |
WRITE | 能夠在已建立的project上傳、修改任務的屬性,能夠刪除任何的project |
EXECUTE | 容許用戶執行任何的任務流 |
SCHEDULE | 容許用戶添加、刪除任何任務流的調度信息 |
CREATEPROJECTS | 在禁止建立project的狀況下仍容許建立新的project |
這裏的權限設置沒有細化到每個user在每個project中,每個用戶所擁有的權限能夠在每個project下面執行相同的操做,另外用戶和用戶組之間的權限信息還不是很明確,若是使用用戶組做爲權限的分配單位(即一個用戶組下的全部用戶擁有相同的權限),每一個用戶再次指定權限就有點多餘了。 shell