廖鍇宇 盧致源 余秋明
摘要:Azkaban,一個(gè)工作在大數(shù)據(jù)Hadoop領(lǐng)域的主流工作流調(diào)度器之一。為更好地使用該任務(wù)調(diào)度系統(tǒng)完成一系列任務(wù),要對(duì)其源碼研究并進(jìn)行二次開發(fā)以實(shí)現(xiàn)自己所需要的功能。該文首先對(duì)開源項(xiàng)目Azkaban任務(wù)調(diào)度系統(tǒng)進(jìn)行分析,接著在其原生系統(tǒng)上二次開發(fā)并新增實(shí)現(xiàn)了四個(gè)功能:任務(wù)一鍵重做功能、默認(rèn)參數(shù)功能、數(shù)據(jù)時(shí)間顯示功能、任務(wù)配置方式改良。經(jīng)測(cè)試,四個(gè)功能模塊都已良好實(shí)現(xiàn)。
關(guān)鍵詞:大數(shù)據(jù);開源項(xiàng)目;二次開發(fā);Azkaban;任務(wù)調(diào)度系統(tǒng)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)19-0087-02
大數(shù)據(jù)中每一條數(shù)據(jù)必須要經(jīng)過采集,傳輸,計(jì)算,展示等過程才能挖掘出利用到其價(jià)值。那么如何把這些步驟連起來使之有序穩(wěn)定的工作亦成了問題的關(guān)鍵。故需要一個(gè)好的調(diào)度平臺(tái)來進(jìn)行各種任務(wù)的調(diào)度管理。Azkaban,就是這樣一個(gè)在Hadoop領(lǐng)域的主流的工作流調(diào)度器之一。Azkaban是由Linkedin開源的一個(gè)批量工作流任務(wù)調(diào)度器,用于在一個(gè)工作流內(nèi)以一個(gè)特定的順序運(yùn)行一組工作和流程。但是想要用好Azkaban這一任務(wù)調(diào)度器,還必須要對(duì)其源碼研究并對(duì)其進(jìn)行二次開發(fā)以實(shí)現(xiàn)自己所要的功能。
1 系統(tǒng)分析
Azkaban系統(tǒng)具體劃分為web server和executor server兩大模塊。Web server功能模塊主要有登錄、項(xiàng)目管理、項(xiàng)目創(chuàng)建、上傳任務(wù)、任務(wù)定時(shí)、執(zhí)行任務(wù)、查看任務(wù)執(zhí)行情況、查看歷史任務(wù)等功能,如圖1所示。
Executor server功能包括調(diào)度hadoop任務(wù)、調(diào)度shell腳本任務(wù)、調(diào)度hive任務(wù)、任務(wù)負(fù)載均衡、單點(diǎn)故障等,如圖2所示意。
2 新功能設(shè)計(jì)
2.1 任務(wù)重做功能設(shè)計(jì)
作為一個(gè)任務(wù)調(diào)度系統(tǒng),系統(tǒng)維持著很多的任務(wù)調(diào)度,那么這些任務(wù)必然有部分任務(wù)會(huì)出現(xiàn)異?;蛘呤?。這時(shí)候就需要人員人工介入排查任務(wù)異常,再解決問題后必然要重新調(diào)起任務(wù)。那么在此時(shí)如果以原生Azkaban系統(tǒng)來完成的話需要點(diǎn)擊任務(wù),然后點(diǎn)擊執(zhí)行,然后輸入?yún)?shù),然后確認(rèn)執(zhí)行這4個(gè)步驟,雖然開源完成但是比較復(fù)雜,而且參數(shù)方面還要重新輸入和原本的一致的參數(shù)。
所以,為了方便用戶能夠快速的重新調(diào)起異常失敗的任務(wù),需要增加一個(gè)一鍵重做的新功能。新增任務(wù)重做功能使得任務(wù)在人工排查完問題后能夠快速的重新調(diào)起執(zhí)行,跳過的復(fù)雜的傳參數(shù)再確認(rèn)的操作,更加方便人性化。
2.2 增加默認(rèn)參數(shù)設(shè)計(jì)
在執(zhí)行任務(wù)流時(shí),F(xiàn)low Parameters選項(xiàng)中進(jìn)行參數(shù)傳遞。通過點(diǎn)擊Add Row按鈕添加Key-Value形式的參數(shù)。在原生系統(tǒng)中是沒有任何固定默認(rèn)參數(shù),但實(shí)際使用中,業(yè)務(wù)流程是相對(duì)固定的,即多數(shù)任務(wù)都需要某些相同的參數(shù)。所以很有必要進(jìn)行默認(rèn)參數(shù)功能的添加,具體實(shí)現(xiàn)。
2.3 任務(wù)歷史頁面增加顯示數(shù)據(jù)時(shí)間設(shè)計(jì)
原生Azkaban系統(tǒng)history頁面有Execution Id(執(zhí)行id)、Flow(任務(wù)流名稱)、Project(項(xiàng)目名稱)、User(執(zhí)行者)、Start Time(任務(wù)開始時(shí)間)、End Time(任務(wù)結(jié)束時(shí)間)、Elapsed(時(shí)長(zhǎng))、Status(狀態(tài))、Action(操作)這9個(gè)展示項(xiàng)。另外值得一提的是Action這項(xiàng)原生系統(tǒng)竟然是空白,所以重做功能也就放在了此處。
2.4 改良任務(wù)配置方式
原生Azkaban系統(tǒng)任務(wù)配置流程為,先在.job文件中配好如下文件:
type=command command=echo "hello" command.1=echo "world"command.2=echo "azkaban"
然后多個(gè).job文件打包成一個(gè)zip包,最后在web頁面project點(diǎn)擊Upload上傳改zip包。此時(shí)Azkaban會(huì)自動(dòng)解析zip包形成一個(gè)job flow任務(wù)流。注意整個(gè)過程中.job文件內(nèi)格式固定不能錯(cuò),.job文件格式和.zip壓縮格式也是固定的。而且更為糟糕的是每次修改任務(wù)都得把以上步驟重復(fù)一遍。
所以對(duì)Azkaban系統(tǒng)進(jìn)行新增web頁面任務(wù)配置功能。在首頁新增選項(xiàng)按鈕“任務(wù)配置”。點(diǎn)擊進(jìn)入后有任務(wù)列表頁面,點(diǎn)擊“Add”即可進(jìn)入如的任務(wù)配置頁面,配置完成后回到任務(wù)列表頁面然后點(diǎn)擊“Upload”提交即整個(gè)任務(wù)配置完成,整個(gè)流程方便快捷,易于操作。
3 新功能實(shí)現(xiàn)
3.1 代碼分析
Azkaban的執(zhí)行代碼主要分為三大模塊:azkaban-web-server:主要提供web界面展示和接收http請(qǐng)求的模塊;azkaban-exec-server:具體執(zhí)行任務(wù)的模塊;azkaban-common:公共模塊,提供訪問數(shù)據(jù)庫,告警,定時(shí)器等公共類
3.1.1 azkaban-web-server模塊
AzkabanWebServer.java為web服務(wù)程序入口類,該類的主要代碼邏輯為:
1)加載 conf 目錄下的 azkaban.properties 和 azkaban.private.properties 兩個(gè)文件,獲取用戶配置的系統(tǒng)參數(shù);2)構(gòu)建Server服務(wù)對(duì)象,Azkaban的web服務(wù)由Jetty提供的;3)是否采用ssl,由配置參數(shù)jetty.use.ssl的值確定,如果為true,則訪問的時(shí)候需要用https,否則默認(rèn)為http服務(wù);4)構(gòu)建Context;5)配置靜態(tài)資源路徑;6)配置動(dòng)態(tài)請(qǐng)求路徑對(duì)應(yīng)的Servlet,每種請(qǐng)求類型都由對(duì)應(yīng)的servlet處理;7)啟動(dòng)服務(wù)。
根據(jù)AzkabanWebServer中定義的請(qǐng)求處理路徑,/executor 請(qǐng)求將會(huì)分發(fā)到ExecutorServlet.javat類,該類進(jìn)行處理請(qǐng)求然后進(jìn)一步調(diào)用方法。
3.1.2 azkaban-common模塊
azkaban是典型的JavaWeb系統(tǒng),如果說azkaban-webserver是表現(xiàn)層的話,那azkaban-common就是業(yè)務(wù)層和持久層,業(yè)務(wù)層邏輯封裝在各個(gè)XXXManager中,持久層就是JdbcExecutorLoader類executorManager.submitExecutableFlow調(diào)用了azkaban-common模塊的ExecutorManager類下的submitExecutableFlow方法,該方法封裝exflow變量的各種屬性值后,調(diào)用以下代碼進(jìn)行入庫executorLoader.uploadExecutableFlow(exflow);同時(shí)調(diào)用dispatch方法從后臺(tái)發(fā)送請(qǐng)求到azkaban-execserver模塊進(jìn)行具體任務(wù)的執(zhí)行dispatch(reference, exflow, choosenExecutor);
3.1.3 azkaban-exec-server模塊
AzkabanExecutorServer為程序入口類,其main方法也像web模塊一樣,封裝了各個(gè)請(qǐng)求路徑的處理servlet所以在common模塊看到的代碼callExecutorForJsonObject(host, port, "/executor", paramList);其實(shí)就是請(qǐng)求了這里的ExecutorServlet類進(jìn)行處理
3.2 數(shù)據(jù)庫設(shè)計(jì)
前面已經(jīng)完成了Azkaban代碼上的修改,但涉及任務(wù)配置功能的改變還修改新增數(shù)據(jù)庫表才能實(shí)現(xiàn),這在代碼中也有體現(xiàn)。新增兩張數(shù)據(jù)庫表。表名jobs,用于儲(chǔ)存任務(wù)信息。表status,用于儲(chǔ)存任務(wù)狀態(tài)。
4 小結(jié)
經(jīng)測(cè)試,對(duì)于以上開源項(xiàng)目Azkaban任務(wù)調(diào)度系統(tǒng)二次開發(fā)的四個(gè)功能模塊都已良好實(shí)現(xiàn)。1)job任務(wù)一鍵重做。對(duì)于失敗任務(wù)或者其他原因需要再次調(diào)度的任務(wù),如果按現(xiàn)有功能需要再重新進(jìn)行傳殘等復(fù)雜操作才能再度調(diào)起。為了方便運(yùn)維調(diào)度,現(xiàn)進(jìn)行開發(fā)在web頁面上增加重做選項(xiàng)功能。2)增加默認(rèn)參數(shù)。現(xiàn)有azkaban在web頁面可以接受多個(gè)key-value形式的參數(shù),在原生系統(tǒng)中是沒有任何固定默認(rèn)參數(shù),但實(shí)際使用中,業(yè)務(wù)流程是相對(duì)固定的,即多數(shù)任務(wù)都需要某些相同的參數(shù)。所以很有必要進(jìn)行默認(rèn)參數(shù)功能的添加。3)歷史任務(wù)頁面增加顯示數(shù)據(jù)時(shí)間?,F(xiàn)有azkaban在歷史任務(wù)頁面只能查看到任務(wù)執(zhí)行時(shí)間而不能查看任務(wù)所執(zhí)行的數(shù)據(jù)時(shí)間。所以需要在歷史任務(wù)頁面增加查看數(shù)據(jù)時(shí)間功能。4)改良project的配置由KV格式gz壓縮文件上傳方式改為更方便簡(jiǎn)單的web頁面配置方式。現(xiàn)有azkaban對(duì)于project的配置是由KV格式gz壓縮文件上傳,每次更改需要重新上傳一份gz文件,較為麻煩。所以對(duì)此進(jìn)行開發(fā)改為更方便簡(jiǎn)單的web頁面配置方式。
參考文獻(xiàn):
[1] Tom White.Hadoop權(quán)威指南[M].北京:清華大學(xué)出版社,2017.
[2] Lambert M Surhone.jetty(Web Werver)[M].美國(guó):Beta Publishing,1988.
[3] Benjamin Muschko.gradle實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2015.
[4] George Reese.JDBC與Java數(shù)據(jù)庫編程[M].北京:中國(guó)電力出版社,2002.
[5] gihub.io[EB/OL]. http://azkaban.gihub.io/azkaban/docs/latest.
[6] gihub.io[EB/OL].https://azkaban.github.io/.