1. 程式人生 > >Spark:基於Yarn的兩種提交模式深度剖析

Spark:基於Yarn的兩種提交模式深度剖析

Spark的三種提交模式

  • Spark核心架構,其實就是第一種模式,standalone模式,基於Spark自己的Master-Worker叢集
  • 第二種,是基於YARN的yarn-cluster模式
  • 第三種,是基於YARN的yarn-client模式。

如果,你要切換到第二種和第三種模式,很簡單,將我們之前用於提交spark應用程式的spark-submit指令碼,加上–master引數,設定為yarn-cluster,或yarn-client,即可。如果你沒設定,那麼,就是standalone模式。

yarn-cluster提交任務方式

在這裡插入圖片描述
yarn-cluster提交模式:

  1. spark-submit提交,傳送請求到ResourceManager請求啟動ApplicationMaster;
  2. ResourceManager分配container在某個nodemanager上,啟動ApplicationMaster(相當於Driver);
  3. ApplicationMaster找到ResourceManager,進行反註冊,請求container啟動executor;
  4. ResourceManager分配一批container給ApplicationMaster用於啟動executor
  5. ApplicationMaster連線其他NodeManager來啟動executor,這裡的NodeManager相當於Worker。
  6. executor啟動後向ApplicationMaster反註冊。ApplicationMaster傳送task到executor

寫法:

./spark-submit
--master yarn
--deploy-mode cluster
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn-cluster
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

yarn-client提交任務方式

在這裡插入圖片描述

yarn-client提交模式:

  1. spark-submit提交,在本地啟動Driver程序,併發送請求給ResourceManager,請求ApplicationMaster。
  2. ResourceManager接收到請求之後分配一個container在某個NodeManager(其實只是一個ExecutorLauncher,相當於ApplicationMaster)。
  3. ExecutorLanucher向ResourceManager申請container,啟動executor;
  4. ResourceManager分配一批contianer給ApplicationMaster用於啟動executor;
  5. ApplicationMaster直接連線啟動NodeManager,用contianer的資源,啟動executor;
  6. Executor啟動後,會反向註冊給Driver,Driver傳送task到Executor,執行情況和結果返回給Driver端。

配置:
在client節點配置中spark-env.sh新增Hadoop_HOME的配置目錄即可提交yarn 任務,具體步驟如下:

export HADOOP_HOME=/usr/local/hadoop

注意:client只需要有Spark的安裝包即可提交任務,不需要其他配置

寫法:

./spark-submit
--master yarn
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn–client
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100
./spark-submit
--master yarn
--deploy-mode  client
--class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar
100

Yarn執行一個任務的過程

  1. 客戶端client向ResouceManager提交Application,ResouceManager接受Application並根據叢集資源狀況選取一個node來啟動Application的任務排程器driver(ApplicationMaster)
  2. ResouceManager找到那個node,命令其該node上的nodeManager來啟動一個新的JVM程序執行程式的driver(ApplicationMaster)部分,driver(ApplicationMaster)啟動時會首先向ResourceManager註冊,說明由自己來負責當前程式的執行
  3. driver(ApplicationMaster)開始下載相關jar包等各種資源,基於下載的jar等資訊決定向ResourceManager申請具體的資源內容。
  4. ResouceManager接受到driver(ApplicationMaster)提出的申請後,會最大化的滿足資源分配請求,併發送資源的元資料資訊給driver(ApplicationMaster);
  5. driver(ApplicationMaster)收到發過來的資源元資料資訊後會根據元資料資訊發指令給具體機器上的NodeManager,讓其啟動具體的container。
  6. NodeManager收到driver發來的指令,啟動container,container啟動後必須向driver(ApplicationMaster)註冊。
  7. driver(ApplicationMaster)收到container的註冊,開始進行任務的排程和計算,直到任務完成。

如果ResourceManager第一次沒有能夠滿足driver(ApplicationMaster)的資源請求,後續發現有空閒的資源,會主動driver(ApplicationMaster)傳送可用資源的元資料資訊以提供更多的資源用於當前程式的執行。

總結:

Yarn-cluster模式:
Yarn-cluster主要用於生產環境中,因為Driver執行在Yarn叢集中某一臺nodeManager中,每次提交任務的Driver所在的機器都是隨機的,不會產生某一臺機器網絡卡流量激增的現象,缺點是任務提交後不能看到日誌,除錯不方便,只能通過yarn logs -applicationId application_id這種命令檢視日誌。

Yarn-client模式:
Yarn-client模式適用於測試,因為Driver執行在本地,負責排程application,會與yarn叢集中的Executor進行大量的通訊,會造成客戶機網絡卡流量的大量增加。好處在於,直接執行時,本地可以看到所有的log,方便除錯。

停止叢集任務命令:yarn application -kill applicationID