Spark基本工作流程及YARN cluster模式原理
轉(zhuǎn)載請注明出處: http://www.cnblogs.com/BYRans/
Spark基本工作流程
相關(guān)術(shù)語解釋
Spark應(yīng)用程序相關(guān)的幾個術(shù)語:
Worker:集群中任何可以運(yùn)行Application代碼的節(jié)點(diǎn),類似于YARN中的NodeManager節(jié)點(diǎn)。在Spark alt="物聯(lián)網(wǎng)" width="534" height="244" />
具體來說,以SparkContext為程序運(yùn)行的總?cè)肟?,在SparkContext的初始化過程中,Spark會分別創(chuàng)建DAGScheduler作業(yè)和TaskScheduler任務(wù)調(diào)度兩級調(diào)度模塊。
其中作業(yè)調(diào)度模塊是基于任務(wù)階段的高層調(diào)度模塊,它為每個Spark作業(yè)計算具有依賴關(guān)系的多個調(diào)度階段(通常根據(jù)shuffle來劃分),然后為每個階段構(gòu)建出一組具體的任務(wù)(通常會考慮數(shù)據(jù)的本地性等),然后以TaskSets(任務(wù)組)的形式提交給任務(wù)調(diào)度模塊來具體執(zhí)行。而任務(wù)調(diào)度模塊則負(fù)責(zé)具體啟動任務(wù)、監(jiān)控和匯報任務(wù)運(yùn)行情況。
詳細(xì)的運(yùn)行流程為:
構(gòu)建Spark Application的運(yùn)行環(huán)境(啟動SparkContext),SparkContext向資源管理器(可以是Standalone、Mesos或YARN)注冊并申請運(yùn)行Executor資源;
資源管理器分配Executor資源并啟動StandaloneExecutorBackend,Executor運(yùn)行情況將隨著心跳發(fā)送到資源管理器上;
SparkContext構(gòu)建成DAG圖,將DAG圖分解成Stage,并把Taskset發(fā)送給Task Scheduler。Executor向SparkContext申請Task,Task Scheduler將Task發(fā)放給Executor運(yùn)行同時SparkContext將應(yīng)用程序代碼發(fā)放給Executor。
Task在Executor上運(yùn)行,運(yùn)行完畢釋放所有資源。

作業(yè)調(diào)度模塊和具體的部署運(yùn)行模式無關(guān),在各種運(yùn)行模式下邏輯相同。不同運(yùn)行模式的區(qū)別主要體現(xiàn)在任務(wù)調(diào)度模塊。不同的部署和運(yùn)行模式,根據(jù)底層資源調(diào)度方式的不同,各自實現(xiàn)了自己特定的任務(wù)調(diào)度模塊,用來將任務(wù)實際調(diào)度給對應(yīng)的計算資源。接下來重點(diǎn)介紹下YARN cluster模式的實現(xiàn)原理和實現(xiàn)細(xì)節(jié)。
YARN cluster運(yùn)行模式的內(nèi)部實現(xiàn)原理
Spark有多種運(yùn)行模式,在這里主要介紹下YARN cluster模式的內(nèi)部實現(xiàn)原理。如下圖是YARN cluster模式的原理框圖,相對于其他模式,該模式比較特殊的是它需要由外部程序輔助啟動APP。用戶的應(yīng)用程序通過輔助的YARN Client類啟動。YARN cluster模式和YARN client模式的區(qū)別在于:YARN client模式的AM是運(yùn)行在提交任務(wù)的節(jié)點(diǎn),而YARN cluster模式的AM是由YARN在集群中選取一個節(jié)點(diǎn)運(yùn)行,不一定是在提交任務(wù)的節(jié)點(diǎn)運(yùn)行。例如spark-shell如果需要使用YARN模式運(yùn)行,只能為 yarn-client 模式,啟動命令可以使用 spark-shell --master yarn-client 。
Client類通過YARN Client API提交請求,在Hadoop集群上啟動一個Spark ApplicationMaster,Spark ApplicationMaster首先注冊自己為一個YARN ApplicationMaster,之后啟動用戶程序,SparkContext在用戶程序中初始化時,使用CoarseGrainedSchedulerBackend配合YARNClusterScheduler,YARNClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等。
根據(jù)Client類傳遞的參數(shù),Spark ApplicationMaster通過YARN ResourceManager/NodeManager的接口在集群中啟動若干個Container,用于運(yùn)行CoarseGrainedExecutorBackend.CoarseGrainedExecutorBackend在啟動過程中會向CoarseGrainedSchedulerBackend注冊。
CoarseGrainedSchedulerBackend是一個基于Akka Actor實現(xiàn)的粗粒度的資源調(diào)度類,在整個Spark作業(yè)運(yùn)行期間,CoarseGrainedSchedulerBackend主要負(fù)責(zé)如下功能:
監(jiān)聽并持有注冊給它的Executor資源
根據(jù)現(xiàn)有的Executor資源,進(jìn)行Executor的注冊、狀態(tài)更新、相應(yīng)Scheduler的請求等任務(wù)的調(diào)度
模式的實現(xiàn)細(xì)節(jié)
Spark的各種運(yùn)行模式雖然在啟動方式、運(yùn)行為之、調(diào)度手段上有所不同,但它們所要完成的任務(wù)基本是一致的,就是在合適的位置安全可靠的根據(jù)用戶的配置和作業(yè)的需要管理和運(yùn)行任務(wù),在運(yùn)行調(diào)度過程中需要考慮的問題主要為:
環(huán)境變量的傳遞
JAR包和各種依賴文件的分發(fā)
任務(wù)的管理和序列化等
用戶參數(shù)配置
用戶及權(quán)限控制
環(huán)境變量的傳遞
Spark的運(yùn)行參數(shù)有很大一部分是通過環(huán)境變量來設(shè)置的,例如Executor的內(nèi)存設(shè)置、Library路徑等。在Cluster模式下就涉及到環(huán)境變量在各個Worker節(jié)點(diǎn)的傳遞問題。不同的運(yùn)行模式有不同的傳遞方式。需要指出的是,在Local模式下,不存在環(huán)境變量的傳遞問題。