azkaban架构介绍
轉自:https://blog.csdn.net/huoji1990/article/details/81911904
官網:https://azkaban.readthedocs.io/en/latest/
1. Azkaban(阿茲卡班)是什么?
Azkaban是由Linkedin公司推出的一個批量工作流任務調度器,主要用于在一個工作流內以一個特定的順序運行一組工作和流程,它的配置是通過簡單的key:value對的方式,通過配置中的dependencies 來設置依賴關系,這個依賴關系必須是無環的,否則會被視為無效的工作流。Azkaban使用job配置文件建立任務之間的依賴關系,并提供一個易于使用的web用戶界面維護和跟蹤你的工作流。
在介紹Azkaban之前,我們先來看一下現有的兩個工作流任務調度系統。知名度比較高的應該是Apache Oozie,但是其配置工作流的過程是編寫大量的XML配置,而且代碼復雜度比較高,不易于二次開發。另外一個應用也比較廣泛的調度系統是Airflow,但是其開發語言是Python。由于我們團隊內部使用Java作為主流開發語言,所以選型的時候就被淘汰掉了。我們選擇Azkaban的原因基于以下幾點:
提供功能清晰,簡單易用的Web UI界面
提供job配置文件快速建立任務和任務之間的依賴關系
提供模塊化和可插拔的插件機制,原生支持command、Java、Hive、Pig、Hadoop
基于Java開發,代碼結構清晰,易于二次開發
2. Azkaban的適用場景
實際項目中經常有這些場景:每天有一個大任務,這個大任務可以分成A,B,C,D四個小任務,A,B任務之間沒有依賴關系,C任務依賴A,B任務的結果,D任務依賴C任務的結果。一般的做法是,開兩個終端同時執行A,B,兩個都執行完了再執行C,最后再執行D。這樣的話,整個的執行過程都需要人工參加,并且得盯著各任務的進度。但是我們的很多任務都是在深更半夜執行的,通過寫腳本設置crontab執行。其實,整個過程類似于一個有向無環圖(DAG)。每個子任務相當于大任務中的一個流,任務的起點可以從沒有度的節點開始執行,任何沒有通路的節點之間可以同時執行,比如上述的A,B。總結起來的話,我們需要的就是一個工作流的調度器,而Azkaban就是能解決上述問題的一個調度器。
3. Azkaban架構
Azkaban在LinkedIn上實施,以解決Hadoop作業依賴問題。我們有工作需要按順序運行,從ETL工作到數據分析產品。最初是單一服務器解決方案,隨著多年來Hadoop用戶數量的增加,Azkaban 已經發展成為一個更強大的解決方案。
Azkaban由三個關鍵組件構成:
關系型數據庫(MySQL)
AzkabanWebServer
AzkabanExecutorServer
3.1 關系型數據庫(MySQL)
Azkaban使用數據庫存儲大部分狀態,AzkabanWebServer和AzkabanExecutorServer都需要訪問數據庫。
AzkabanWebServer使用數據庫的原因如下:
項目管理:項目、項目權限以及上傳的文件。
執行流狀態:跟蹤執行流程以及執行程序正在運行的流程。
以前的流程/作業:通過以前的作業和流程執行以及訪問其日志文件進行搜索。
計劃程序:保留計劃作業的狀態。
SLA:保持所有的SLA規則
AzkabanExecutorServer使用數據庫的原因如下:
訪問項目:從數據庫檢索項目文件。
執行流程/作業:檢索和更新正在執行的作業流的數據
日志:將作業和工作流的輸出日志存儲到數據庫中。
交互依賴關系:如果一個工作流在不同的執行器上運行,它將從數據庫中獲取狀態。
3.2 AzkabanWebServer
AzkabanWebServer是整個Azkaban工作流系統的主要管理者,它負責project管理、用戶登錄認證、定時執行工作流、跟蹤工作流執行進度等一系列任務。同時,它還提供Web服務操作的接口,利用該接口,用戶可以使用curl或其他ajax的方式,來執行azkaban的相關操作。操作包括:用戶登錄、創建project、上傳workflow、執行workflow、查詢workflow的執行進度、殺掉workflow等一系列操作,且這些操作的返回結果均是json的格式。并且Azkaban使用方便,Azkaban使用以.job為后綴名的鍵值屬性文件來定義工作流中的各個任務,以及使用dependencies屬性來定義作業間的依賴關系鏈。這些作業文件和關聯的代碼最終以*.zip的方式通過Azkaban UI上傳到Web服務器上。
3.3 AzkabanExecutorServer
以前版本的Azkaban在單個服務中具有AzkabanWebServer和AzkabanExecutorServer功能,目前Azkaban已將AzkabanExecutorServer分離成獨立的服務器,拆分AzkabanExecutorServer的原因有如下幾點:
某個任務流失敗后,可以更方便的將其重新執行
便于Azkaban升級
AzkabanExecutorServer主要負責具體的工作流的提交、執行,可以啟動多個執行服務器,它們通過mysql數據庫來協調任務的執行。
4. Azkaban作業流執行過程
Webserver根據內存中緩存的各Executor的資源狀態(Webserver有一個線程會遍歷各個active executor,去發送http請求獲取其資源狀態信息緩存到內存中),按照選擇策略(包括executor資源狀態、最近執行流個數等)選擇一個executor下發作業流;
executor判斷是否設置作業粒度分配,如果未設置作業粒度分配,則在當前executor執行所有作業;如果設置了作業粒度分配,則當前節點會成為作業分配的決策者,即分配節點;
分配節點從zookeeper獲取各個executor的資源狀態信息,然后根據策略選擇一個executor分配作業;
被分配到作業的executor即成為執行節點,執行作業,然后更新數據庫。
5. Azkaban架構的三種運行模式
在版本3.0中,Azkaban提供了以下三種模式:
solo server mode:最簡單的模式,數據庫內置的H2數據庫,AzkabanWebServer和AzkabanExecutorServer都在一個進程中運行,任務量不大項目可以采用此模式。
two server mode:數據庫為MySQL,管理服務器和執行服務器在不同進程,這種模式下,AzkabanWebServer和AzkabanExecutorServer互不影響。
multiple executor mode:該模式下,AzkabanWebServer和AzkabanExecutorServer運行在不同主機上,且AzkabanExecutorServer可以有多個。
總結
以上是生活随笔為你收集整理的azkaban架构介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析
- 下一篇: flutter入门之常见的flutter