排程框架Azkaban快速入門
作者:林偉兵 ,叩丁狼高階講師。本文為原創文章,轉載請註明出處。
1. Azkaban概述
Azkaban技術產生前景:
在大資料分析場景中,以ETL( Extract抽取 -Transform互動轉換 -Load載入 )為例 ,資料的操作包含了如下流程:RDBMS ==>Sqoop ==>Hadoop ==>Sqoop ==>RDBMS/NoSQL/...
,這裡涉及了三個流程:資料抽取 ==> 資料清洗 ==> 資料入庫
。
這三個步驟出現了明顯的順序問題。假設資料抽取需要3h,資料清洗需要2h,資料入庫需要1h。我們可以使用linux shell提供的crontab 來實現。他的優點是使用簡單,缺點卻有很多:
1. 流程不便於跟蹤和監控(流程某個環境出錯沒辦法監控)。
2. 在這個流程中有些模組執行的時間可能出現延遲/提前。比如資料清洗預測需要2h,結果用了3h,此刻資料入庫在前一個任務還沒執行完就已經開始執行了;比如清洗預測需要2h,結果用了1h,導致後面的流程出現無效等待的狀態。
因此,像Azkaban這樣的排程框架在我們資料平臺中就扮演著很重要的角色。
大資料中常見的排程框架
大資料中常見的排程框架,最常見的就是crontab。除此之外還有很多整合框架:
- Quartz:Quartz是OpenSymphony[ˈəʊpən ˈsɪmfəni] 開源組織在Job scheduling領域又一個開源專案,它可以與J2EE與J2SE應用程式相結合也可以單獨使用。
- Azkaban:Azkaban是由Linkedin公司推出的一個批量工作流任務排程器, 其使用job配置檔案建立任務之間的依賴關係,並提供一個易於使用的web使用者介面維護和跟蹤你的工作流 。
- Oozie:Oozie是一個工作流引擎伺服器,用於執行hadoop map/reduce和hive等任務工作流。同時Oozie還是一個java web程式,執行在java servlet容器中,如tomcat中。Oozie以action為基本單位,可以將多個action構成一個DAG圖的模式執行。Oozie工作流通過HPDL(一種通過XML自定義處理的語言)來構造Oozie工作流。
- Zeus
Azkaban概述
Azkaban是一個由LinkedIn 建立的用來跑Hadoop 任務的批量的工作流執行器;其解決了job依賴順序的問題,並提供了一個簡單易用的使用者介面檢測我們的工作流。
Azkaban特性如下:
-
相容所有Hadoop版本
-
簡單易用的web操作介面和web工作流資源提交機制
- 在Azkaban中每個專案相互獨立互不影響。
- 良好的工作流執行封裝(執行任務流無需太複雜的操作 一個按鈕搞定)。
- 模組化和外掛化:執行的具體任務不會與Azkaban相互耦合,程式碼侵入性低。
- 認證與授權:良好的許可權管理機制
- 跟蹤使用者的行為:方便出現問題後知道是哪個使用者的錯誤導致的。
- 任務成功/失敗後的 郵件通知機制
- 任務錯誤的重試機制
Azkaban3.x 以後不提供直接的安裝包下載,其安裝包需通過Gradle指令碼來編譯, 並且要求最低的Java版本是8. 如下是Azkaban的學習網站:
- Azkaban的官網:https://azkaban.github.io
- Azkaban的框架原始碼:https://github.com/azkaban/azkaban
- Azkaban文件:https://github.com/azkaban/azkaban.github.io
2. Azkaban架構簡析
Azkaban由三個關鍵元件構成(如下圖):
- MySQL關係型資料庫:Azkaban使用資料庫儲存大部分狀態,AzkabanWebServer和AzkabanExecutorServer都需要訪問資料庫。
- AzkabanWebServer:AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它負責project管理、使用者登入認證、定時執行工作流、跟蹤工作流執行進度等一系列任務。
- AzkabanExecutorServer:早期版本的Azkaban在單個服務中具有AzkabanWebServer和AzkabanExecutorServer功能,目前Azkaban已將AzkabanExecutorServer分離成獨立的伺服器。其好處是某個任務流失敗後,可以更方便的將其重新執行,便於Azkaban升級。
Azkaban的兩種執行模式
在版本3.0中,Azkaban提供了以下兩種模式:
- solo server mode:最簡單的模式,資料庫內建的H2資料庫,AzkabanWebServer和AzkabanExecutorServer都在一個程序中執行,任務量不大專案可以採用此模式(特別適合初學者學習使用,功能齊全)。
- multiple executor mode: 適用於更多的生產環境,其使用MySQL 來進行元資料管理並且支援主從結構。在這種模式下web server和executor server 獨立執行在不同的主機中。這種模式帶來的好處是可以讓Azkaban更加健壯和可擴充套件。
在學習的過程中,我們可以使用來solo server 這種模式來執行Azkaban例項。
3. Azkaban的下載和編譯
-
下載之前 請確保本機的 Java 版本為 1.8 。
-
下載Azkaban原始碼:
-
解壓azkaban壓縮包並進入該目錄:
azkaban-common: 基本的依賴包
azkaban-db: 框架核心元件-資料庫工具
azkaban-exec-server & azkaban-web-server : 框架核心元件
azkaban-solo-server: 整合執行模式工具包
azkaban-spi : azkaban儲存介面以及exception類
azkaban-hadoop-security-plugin: hadoop 有關kerberos外掛
-
在編譯原始碼之前,先要下載gradle的依賴包,至於要什麼版本,檢視如下:
如下地址是Gradle的官方下載地址:https://services.gradle.org/distributions
下載好對應的版本後,將壓縮包存放到如下位置:
修改配置檔案:
-
返回安裝包主目錄執行編譯程式(注意官方給出的編譯版本不帶測試命令-x test,示例如下)
# Build without running tests >$ ./gradlew build installDist -x test
-
執行上面的命令,出現了git有關的異常,這裡主要是系統沒有安裝git命令,使用
yum install -y git
,後重新執行步驟4,接下來等待漫長的下載(因為預設使用的是國外的gradle映象進行資源下載)。
-
為了減少編譯時下載佔用時間,一般會為gradle遠端資源提供映象地址方便下載:
#在 ${AZKABAN_HOME}/build.gradle檔案中配置,然後重新執行步驟4: mavenLocal() maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} maven{ url 'http://maven.oschina.net/content/groups/public/'}
-
編譯成功後,可以找到整個架構的每個部分都會多出一個build資料夾,這才是我們要安裝的檔案:
[root@azkabanvm azkaban]# ls azkaban-solo-server/build classes distributions install libs resources tmp [root@azkabanvm azkaban]# ls azkaban-exec-server/build classes distributions install libs resources tmp [root@azkabanvm azkaban]# ls azkaban-web-server/build classes distributions dust install jsToPackage less libs nodejs resources tmp [root@azkabanvm azkaban]# ls azkaban-db/build classes distributions install libs sql tmp