歡迎轉載,轉載請註明出處,徽滬一郎。html
Hadoop2中的Yarn是一個分佈式計算資源的管理平臺,因爲其有極好的模型抽象,很是有可能成爲分佈式計算資源管理的事實標準。其主要職責將是分佈式計算集羣的管理,集羣中計算資源的管理與分配。java
Yarn爲應用程序開發提供了比較好的實現標準,Spark支持Yarn部署,本文將就Spark如何實如今Yarn平臺上的部署做比較詳盡的分析。
node
上圖是Spark Standalone Cluster中計算模塊的簡要示意,從中能夠看出整個Cluster主要由四種不一樣的JVM組成git
換個角度來講,Master對資源的管理是在進程級別,而SchedulerBackend則是在線程的級別。github
啓動時序圖apache
YARN的基本架構如上圖所示,由三大功能模塊組成,分別是1) RM (ResourceManager) 2) NM (Node Manager) 3) AM(Application Master)編程
上述說了一大堆,說白了在編寫YARN Application時,主要是實現Client和ApplicatonMaster。實例請參考github上的simple-yarn-app.bash
結合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卻是有。
參考資料