欢迎转载,转载请注明出处,徽沪一郎。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却是有。
参考资料