天天看點

大資料開發 | SPARK ON YARN運作模式

作者:尚矽谷教育

面試過程中經常被問到spark on yarn的運作模式及差別,接下來我們從多方面展開闡述。

一、YARN介紹

Yarn 的全稱是 Yet Anther Resource Negotiator(另一種資源協商者)。它作為 Hadoop 的一個元件,官方對它的定義是一個工作排程和叢集資源管理的架構。可以基于這種資源管理機制運作多種計算架構,比如mapreduce和spark、flink。注意任何計算架構與YARN的結合,都必須遵循YARN的運作流程,如下圖:

大資料開發 | SPARK ON YARN運作模式

ResourceManager和NodeManagers是整個計算架構的核心部分。ResourceManager負責資源的配置設定,将叢集的資源配置設定給各個應用使用,而資源配置設定和排程的基本機關是Container。

Container封裝了記憶體,磁盤和網絡,每個任務都會被配置設定給Container,該任務使用Container中的資源執行,而NodeManager則是一個計算節點的管理者,負責啟動Application所需的Container,并且對内部資源進行監控,将記憶體、磁盤、CPU等資源的使用情況彙報給ResourceManager。

二、spark角色描述

Application: Appliction是指使用者編寫的Spark應用程式,其中包括一個Driver功能的代碼和分布在叢集中多個節點上運作的Executor代碼。

Driver: Spark中的Driver即運作上述Application的main函數并建立SparkContext,建立SparkContext的目的是為了準備Spark應用程式的運作環境,在Spark中有SparkContext負責與ClusterManager通信,進行資源申請、任務的配置設定和監控等,當Executor部分運作完畢後,Driver同時負責将SparkContext關閉,通常用SparkContext代表Driver。

Executor: 某個Application運作在worker節點上的一個程序, 該程序負責運作某些Task, 并且負責将資料存到記憶體或磁盤上,每個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下,其程序名稱為CoarseGrainedExecutorBackend。一個CoarseGrainedExecutorBackend有且僅有一個Executor對象, 負責将Task包裝成taskRunner,并從線程池中抽取一個空閑線程運作Task,每一個CoarseGrainedExecutorBackend能并行運作Task的數量取決于配置設定給它的cpu個數。

ClusterManager:指的是在叢集上擷取資源的外部服務。目前有三種類型:

Standalon:spark原生的資源管理,由Master負責資源的配置設定

Apache Mesos:與hadoop MR相容性良好的一種資源排程架構

Hadoop Yarn: 主要是指Yarn中的ResourceManager

Worker: 叢集中任何可以運作Application代碼的節點,在Standalone模式中指的是通過slave檔案配置的Worker節點,在Spark on Yarn模式下就是NodeManager節點。

Task: 被送到某個Executor上的工作單元,與hadoopMR中的MapTask和ReduceTask概念一樣,是運作Application的基本機關,多個Task組成一個Stage,而Task的排程和管理等是由TaskScheduler負責。

Job: 包含多個Task組成的并行計算,往往由Spark Action執行算子觸發生成,一個Application中往往會産生多個Job。

Stage: 每個Job會被拆分成多組Task,作為一個TaskSet,其名稱為Stage。Stage的劃分和排程由DAGScheduler來負責的。Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發生shuffle的地方。

DAGScheduler: 根據Job建構基于Stage的DAG(Directed Acyclic Graph有向無環圖),并送出Stage給TaskScheduler。其劃分Stage的依據是RDD之間的依賴的關系找出開銷最小的排程方法。

TaskScheduler : 将TaskSet送出給worker運作,每個Executor運作什麼Task就是在此處配置設定的。TaskScheduler維護所有TaskSet,當Executor向Driver發出心跳時,TaskScheduler會根據資源剩餘情況配置設定相應的Task。另外TaskScheduler還維護着所有Task的運作标簽,和失敗重試的Task。

三、SPARK ON YARN運作模式

SPARK ON YARN運作模式根據Driver在叢集中的位置可以分為YARN-Client模式和YARN-Cluster模式。

1.兩模式差別:

(YARN-Client簡寫成client和 YARN-Cluster簡寫成cluster)

Driver的運作位置:

client:Driver運作在Client端(即送出作業的機器)。

cluster:Driver運作在ApplicationMaster中。

用戶端是否能退出:

client:因為client會和請求到的Container進行通信來完成作業的調制和執行,是以不能退出。

cluster:clinet隻要送出完作業後就可以關掉,因為作業已經在yarn運作了。

ApplicationMaster的職責:

clinet:到Yarn Resource Manager去申請資源。

cluster:除了要申請資源,還要處理作業排程。

運作的輸出日志的位置:

clinet:日志會輸出到控制台,便于測試

cluster:因為日志在Driver上,是以需要通過指令

$ yarn logs -applicationId <app ID>

(前提是要配置屬性 yarn.log-aggregation-enable)或者在Spark Web UI上來檢視日志

2.YARN-Client運作模式如下圖所示:

大資料開發 | SPARK ON YARN運作模式

在SparkContext啟動過程中,會初始化DAGScheduler排程器、YarnScheduler和YarnClientSchedulerBackend,和啟動DriverEndpoint和Client,這些都是在用戶端Client過程中進行的。

YARN-Client模式,Driver在用戶端本地運作,這種模式可以使得Spark Application和用戶端進行互動, 因為Driver在用戶端本地運作, 使得Spark Application 和 用戶端進行互動, 可以通過WebUI通路Driver的狀态。

使用spark-submit 腳本送出應用程式時可以通過參數deploy-mode 指定client 設定為Yarn-Client模式:

./bin/spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode client \

--driver-memory 4g \

--executor-memory 2g \

--executor-cores 1 \

examples/jars/spark-examples*.jar

3.YARN-Cluster運作模式如下圖所示:

大資料開發 | SPARK ON YARN運作模式

在YARN-Cluster運作模式中,當使用者向YARN送出應用程式後,YARN将分為兩個階段運作在該應用程式,第一個階段是把Spark的Driver作為一個Application Master在YARN叢集中先啟動,第二個階段是由Application Master建立應用程式,然後它會向Resource Manager申請資源,并啟動Executor運作任務及監控運作過程。

在YARN-Cluster運作模式下,用戶端隻負責送出應用程式,這個過程包括啟動Application Master指令、及送出給Application Mater的程式和需要在Executor中運作的程式等。而關于SparkContext的初始化則是由ResourceManager在收到Client的請求後,在叢集中選擇一個NodeManager,為該應用程式配置設定Container,啟動Application Master。之後Application Master對SparkContext進行初始化,這是YARN兩種運作模式下最直覺的差別。

使用spark-submit 腳本送出應用程式時可以通過參數deploy-mode 指定cluster 設定為Yarn-cluster模式:

./bin/spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode cluster \

--driver-memory 1g \

--executor-memory 1g \

--executor-cores 1 \

examples/jars/spark-examples*.jar

四、總結

SPARK ON YARN模式可以分為YARN-Client和YARN-Cluster兩種模式,這兩種模式的主要差別在于Driver程式運作的節點不同。YARN-Client模式下,Driver程式直接運作在用戶端,當使用者希望進行互動、調試、立即看到APP的輸出結果的情況下,可以使用這種模式。YARN-Cluster模式下,Driver程式運作在由RM(ResourceManager)啟動的AP(APPMaster)上,YARN-Cluster模式更适合用于生産環境,是使用最廣泛地模式。

繼續閱讀