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 强烈推荐!!!
相关文章
相关标签/搜索