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