Apache Spark源碼走讀之8 -- Spark on Yarn

歡迎轉載,轉載請註明出處,徽滬一郎。html

概要

Hadoop2中的Yarn是一個分佈式計算資源的管理平臺,因爲其有極好的模型抽象,很是有可能成爲分佈式計算資源管理的事實標準。其主要職責將是分佈式計算集羣的管理,集羣中計算資源的管理與分配。java

Yarn爲應用程序開發提供了比較好的實現標準,Spark支持Yarn部署,本文將就Spark如何實如今Yarn平臺上的部署做比較詳盡的分析。
node

Spark Standalone部署模式回顧

上圖是Spark Standalone Cluster中計算模塊的簡要示意,從中能夠看出整個Cluster主要由四種不一樣的JVM組成git

  1. Master 負責管理整個Cluster,Driver Application和Worker都須要註冊到Master
  2. Worker 負責某一個node上計算資源的管理,如啓動相應的Executor
  3. Executor RDD中每個Stage的具體執行是在Executor上完成
  4. Driver Application driver中的schedulerbackend會由於部署模式的不一樣而不一樣

換個角度來講,Master對資源的管理是在進程級別,而SchedulerBackend則是在線程的級別。github

啓動時序圖apache

YARN的基本架構和工做流程

YARN的基本架構如上圖所示,由三大功能模塊組成,分別是1) RM (ResourceManager) 2) NM (Node Manager) 3) AM(Application Master)編程

做業提交

  1. 用戶經過Client向ResourceManager提交Application, ResourceManager根據用戶請求分配合適的Container,而後在指定的NodeManager上運行Container以啓動ApplicationMaster
  2. ApplicationMaster啓動完成後,向ResourceManager註冊本身
  3. 對於用戶的Task,ApplicationMaster須要首先跟ResourceManager進行協商以獲取運行用戶Task所須要的Container,在獲取成功後,ApplicationMaster將任務發送給指定的NodeManager
  4. NodeManager啓動相應的Container,並運行用戶Task

實例

上述說了一大堆,說白了在編寫YARN Application時,主要是實現ClientApplicatonMaster。實例請參考github上的simple-yarn-app.bash

Spark on Yarn

結合Spark Standalone的部署模式和YARN編程模型的要求,作了一張表來顯示Spark Standalone和Spark on Yarn的對比。架構

Standalone YARN Notes 
Client Client standalone請參考spark.deploy目錄
Master ApplicationMaster  
Worker ExecutorRunnable  
Scheduler YarnClusterScheduler  
SchedulerBackend YarnClusterSchedulerBackend  

做上述表格的目的就是要搞清楚爲何須要作這些更改,與以前Standalone模式間的對應關係是什麼。代碼走讀時,分析的重點是ApplicationMaster, YarnClusterSchedulerBackend和YarnClusterScheduler
app

通常來講,在Client中會顯示的指定啓動ApplicationMaster的類名,以下面的代碼所示

ContainerLaunchContext amContainer =
        Records.newRecord(ContainerLaunchContext.class);
    amContainer.setCommands(
        Collections.singletonList(
            "$JAVA_HOME/bin/java" +
            " -Xmx256M" +
            " com.hortonworks.simpleyarnapp.ApplicationMaster" +
            " " + command +
            " " + String.valueOf(n) +
            " 1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stdout" +
            " 2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stderr"
            )
        );

但在yarn.Client中並無直接指定ApplicationMaster的類名,是經過ClientArguments進行了封裝,真正指定啓動類的名稱的地方在ClientArguments中。構造函數中指定了amClass的默認值是org.apache.spark.deploy.yarn.ApplicationMaster

實例說明

將SparkPi部署到Yarn上,下述是具體指令。

$ SPARK_JAR=./assembly/target/scala-2.10/spark-assembly-0.9.1-hadoop2.0.5-alpha.jar \
    ./bin/spark-class org.apache.spark.deploy.yarn.Client \
      --jar examples/target/scala-2.10/spark-examples-assembly-0.9.1.jar \
      --class org.apache.spark.examples.SparkPi \
      --args yarn-standalone \
      --num-workers 3 \
      --master-memory 4g \
      --worker-memory 2g \
      --worker-cores 1

從輸出的日誌能夠看出, Client在提交的時候,AM指定的是org.apache.spark.deploy.yarn.ApplicationMaster

13/12/29 23:33:25 INFO Client: Command for starting the Spark ApplicationMaster: $JAVA_HOME/bin/java -server -Xmx4096m -Djava.io.tmpdir=$PWD/tmp org.apache.spark.deploy.yarn.ApplicationMaster --class org.apache.spark.examples.SparkPi --jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar --args  'yarn-standalone'  --worker-memory 2048 --worker-cores 1 --num-workers 3 1> /stdout 2> /stderr

小結

spark在提交時,所作的資源申請是一次性完成的,也就是說對某一個具體的Application,它所須要的Executor個數是一開始就是計算好,整個Cluster若是此時可以知足需求則提交,不然進行等待。並且若是有新的結點加入整個cluster,已經運行着的程序並不能使用這些新的資源。缺乏rebalance的機制,這點上storm卻是有。

參考資料

  1. Launch Spark On YARN http://spark.apache.org/docs/0.9.1/running-on-yarn.html
  2. Getting started Writing YARN Application http://hortonworks.com/blog/getting-started-writing-yarn-applications/
  3. 《Hadoop技術內幕 深刻解析YARN架構設計與實現原理》 董西成著
  4. YARN應用開發流程  http://my.oschina.net/u/1434348/blog/193374 強烈推薦!!!
相關文章
相關標籤/搜索