黑猴子的家:Hue 中 Spark 實(shí)現(xiàn)提交運(yùn)行源碼過程

一.簡介

1.1 Hue notebook

在Hue3.8版本之前,spark是以UI組件進(jìn)行展示的。在3.8版本之后,為了支持不同語言例如python,scala并提供一個(gè)類似REPL(類似于一個(gè)終端可以編輯所有變成語言)的環(huán)境。Hue提供了notebook組件并將關(guān)于spark的運(yùn)行邏輯放置在notebook UI中執(zhí)行。為了執(zhí)行Spark作業(yè),需要安裝Livy服務(wù)器。

1.2 Spark Livy Server

為了執(zhí)行Spark Job,Hue提供了執(zhí)行服務(wù)器Livy,加強(qiáng)了Hue notebook對(duì)spark的支持。它類似于Oozie hadoop工作流服務(wù)器,對(duì)外提供了Rest Api,客戶端將spark jar以及配置參數(shù)傳遞給livy,livy依據(jù)配置文件以及參數(shù)執(zhí)行jar。

P.s. livy出現(xiàn)時(shí)間不長,維護(hù)的版本才到0.2.0。并沒有Oozie成熟,直接使用作為spark server 感覺坑會(huì)比較多。

二.配置Livy

livy在Hue中自帶源碼,位置在${HUE_PATH}/apps/spark/java下,進(jìn)行編譯后執(zhí)行(可能會(huì)有日志jar包不存在報(bào)錯(cuò),修改classpath并添加)。

在運(yùn)行成功后,可以對(duì)livy服務(wù)器發(fā)送Rest請(qǐng)求并執(zhí)行scala,spark Job等。具體的配置路徑可以查看livy的github(https://github.com/cloudera/livy)。

三.Hue中notebook提交Spark Job的源碼實(shí)現(xiàn)

為了方便閱讀,按照操作的步驟進(jìn)行解讀:

3.1、打開notebook頁面

發(fā)送請(qǐng)求:http://{Livy_IP}:{Livy_port}/notebook/new

源碼(desktop/libs/notebook/views/new),在這個(gè)方法中主要驗(yàn)證了當(dāng)前的運(yùn)行環(huán)境是否是yarn。之后會(huì)返回包含notebook_id 的json數(shù)據(jù)渲染notebook.mako。進(jìn)入notebook頁面如下:

3.2、點(diǎn)擊UI

當(dāng)點(diǎn)擊+后產(chǎn)生notebook的代碼片段輸入部分。根據(jù)Hue的Session對(duì)象在Livy服務(wù)器中生成一個(gè)session,以后如果session一直保存則無需再調(diào)此接口。發(fā)送請(qǐng)求:/notebook/api/create_session

源碼(desktop/libs/notebook/api/create_session),該方法的執(zhí)行流程:首先它會(huì)根據(jù)點(diǎn)擊的按鈕調(diào)用notebook.connectors,這是個(gè)工廠模式,返回不同鏈接的api。

包含鏈接的api如上。在這主要以sparkApi做為例子。以這個(gè)接口做為對(duì)象調(diào)用相應(yīng)的createSession方法。調(diào)用了Livy中的/session接口,POST形式發(fā)送的Request Body為一些配置信息,這些信息是從Hue的Session中獲取,進(jìn)行加工后傳輸給Livy。最終會(huì)在Livy服務(wù)器中生成對(duì)應(yīng)的Session,客戶端通過返回的id值獲取此Session。

在Livy中用戶的操作都是通過session進(jìn)行,未來開發(fā)需要對(duì)此session進(jìn)行有效的管理(由于此Session都是存儲(chǔ)在Livy服務(wù)器上,未來開發(fā)需要將session的內(nèi)容同步到本地上來,防止服務(wù)器session丟失以至于丟失用戶以往的工作內(nèi)容)。

3.3、切換不同的語言狀態(tài)

發(fā)送請(qǐng)求:/notebook/api/autocomplete/

源碼(desktop/libs/notebook/api/autocomplete)這里會(huì)依據(jù)不同的輸入?yún)?shù)修改鏈接的內(nèi)容,比如如果選擇DB操作,在這個(gè)方法中首先會(huì)對(duì)數(shù)據(jù)庫進(jìn)行連接。Spark的相關(guān)操作在這并不做修改。

3.4、提交作業(yè)

以Spark Submit Job做為例子:

主要輸入?yún)?shù)為Path,Main-class以及arguements。其中Path為jar所在的位置,最好放置在HDFS中進(jìn)行執(zhí)行??梢詮谋镜厣蟼?。

3.5、執(zhí)行

在這個(gè)頁面點(diǎn)擊執(zhí)行的時(shí)候測(cè)試有點(diǎn)bug主要是執(zhí)行按鈕為不可選,切換到別的編輯模式再換回來才可執(zhí)行。

發(fā)送請(qǐng)求:/notebook/api/execute

源碼(desktop/libs/notebook/api/execute)。在這個(gè)方法中。執(zhí)行的主要語句為response['handle'] = get_api(request, snippet).execute(notebook, snippet)在這句話中,首先使用get_api依照2步驟中獲取指定類別的API。然后執(zhí)行 該接口中的execute方法。

SparkApi接口中的執(zhí)行該方法,去操作notebook和snippet這兩個(gè)對(duì)象。這兩個(gè)對(duì)象是用于確定session的。

最終以api中的HttpClient發(fā)送post請(qǐng)求到livy服務(wù)器中,發(fā)送的url為

Session/{uuid}/statements。Uuid為session對(duì)象中的ID屬性值;發(fā)送的Data對(duì)象為snippet中的statement的數(shù)據(jù)(也就是執(zhí)行的語句)和notebook對(duì)象(包含了執(zhí)行的properties)。

3.6、執(zhí)行期間被調(diào)用的其他接口

(1)當(dāng)運(yùn)行job時(shí)會(huì)調(diào)用 check_status接口(notebook/api/check_status)。

這樣同樣會(huì)通過rest接口請(qǐng)求livy服務(wù)器中的執(zhí)行的一系列語句的結(jié)果。這是一個(gè)GET請(qǐng)求,返回狀態(tài)。

如果狀態(tài)為failed或者expire可能會(huì)拋出異常,需處理。

(2)fetch_result_data會(huì)返回當(dāng)前session的所有執(zhí)行的語句,以list進(jìn)行展示。調(diào)用的接口為(notebook/api/fetch_result_data)。

以GET形式發(fā)送給Livy url為sessions/{session}/statements

(3)jobs接口(jobbrowser/views/jobs),獲取有關(guān)于當(dāng)前用戶執(zhí)行的job 的log日志。這是一個(gè)定時(shí)的任務(wù)接口,如果有任務(wù)正在進(jìn)行中,會(huì)不斷的向livy服務(wù)器發(fā)送請(qǐng)求獲取當(dāng)前session用戶執(zhí)行job的日志。從logs可以找出有哪些job_id,最終根據(jù)這些jobs獲取job的詳細(xì)信息,并返回。

以GET形式進(jìn)行發(fā)送,url為sessions/{uuid}/logs,其中uuid為當(dāng)前session的唯一標(biāo)識(shí)符。

四.總結(jié)

Hue在提交并執(zhí)行作業(yè)的時(shí)候使用的是Oozie和Livy服務(wù)器,將Hue做為一個(gè)client進(jìn)行開發(fā),將封裝好的數(shù)據(jù)通過RestApi發(fā)送給兩種服務(wù)器進(jìn)行作業(yè)的提交,執(zhí)行和管理。

但是相較于Oozie,Livy并不包含DAG圖,所以在執(zhí)行Spark作業(yè)的時(shí)候多節(jié)點(diǎn)直接可能無法產(chǎn)生依賴,無法保證執(zhí)行的次序。目前調(diào)研看來,Spark作業(yè)最好為單節(jié)點(diǎn),或者無依賴的鏈表形式執(zhí)行。

P.S. spark sql的操作是在HIVE中執(zhí)行,在運(yùn)行前需要保證Thrift Server有效運(yùn)行,Hue會(huì)把hivesql之間發(fā)送給sparksql的ThriftServer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容