分享

Apache Spark源码走读之8 -- Spark on Yarn

本帖最后由 pig2 于 2015-1-6 14:12 编辑
问题导读
1、如何实现Spark在Yarn平台上的部署?
2、如何理解spark在提交时,所做的资源申请是一次性完成的?
3、如何理解Spark Standalone和Spark on Yarn的区别?







概要
Hadoop2中的Yarn是一个分布式计算资源的管理平台,由于其有极好的模型抽象,非常有可能成为分布式计算资源管理的事实标准。其主要职责将是分布式计算集群的管理,集群中计算资源的管理与分配。

Yarn为应用程序开发提供了比较好的实现标准,Spark支持Yarn部署,本文将就Spark如何实现在Yarn平台上的部署作比较详尽的分析。

Spark Standalone部署模式回顾
1.png


上图是Spark Standalone Cluster中计算模块的简要示意,从中可以看出整个Cluster主要由四种不同的JVM组成
  • Master 负责管理整个Cluster,Driver Application和Worker都需要注册到Master
  • Worker 负责某一个node上计算资源的管理,如启动相应的Executor
  • Executor RDD中每一个Stage的具体执行是在Executor上完成
  • Driver Application driver中的schedulerbackend会因为部署模式的不同而不同


换个角度来说,Master对资源的管理是在进程级别,而SchedulerBackend则是在线程的级别。

启动时序图
2.png



YARN的基本架构和工作流程
3.png


YARN的基本架构如上图所示,由三大功能模块组成,分别是1) RM (ResourceManager) 2) NM (Node Manager) 3) AM(Application Master)

作业提交
  • 用户通过Client向ResourceManager提交Application, ResourceManager根据用户请求分配合适的Container,然后在指定的NodeManager上运行Container以启动ApplicationMaster
  • ApplicationMaster启动完成后,向ResourceManager注册自己
  • 对于用户的Task,ApplicationMaster需要首先跟ResourceManager进行协商以获取运行用户Task所需要的Container,在获取成功后,ApplicationMaster将任务发送给指定的NodeManager
  • NodeManager启动相应的Container,并运行用户Task


实例
上述说了一大堆,说白了在编写YARN Application时,主要是实现Client和ApplicatonMaster。实例请参考github上的simple-yarn-app.

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
1.png



一般来说,在Client中会显示的指定启动ApplicationMaster的类名,如下面的代码所示
  1.     ContainerLaunchContext amContainer =
  2.         Records.newRecord(ContainerLaunchContext.class);
  3.     amContainer.setCommands(
  4.         Collections.singletonList(
  5.             "$JAVA_HOME/bin/java" +
  6.             " -Xmx256M" +
  7.             " com.hortonworks.simpleyarnapp.ApplicationMaster" +
  8.             " " + command +
  9.             " " + String.valueOf(n) +
  10.             " 1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stdout" +
  11.             " 2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + "/stderr"
  12.             )
  13.         );
复制代码



但在yarn.Client中并没有直接指定ApplicationMaster的类名,是通过ClientArguments进行了封装,真正指定启动类的名称的地方在ClientArguments中。构造函数中指定了amClass的默认值是org.apache.spark.deploy.yarn.ApplicationMaster

实例说明
将SparkPi部署到Yarn上,下述是具体指令。
  1. $ SPARK_JAR=./assembly/target/scala-2.10/spark-assembly-0.9.1-hadoop2.0.5-alpha.jar \
  2.     ./bin/spark-class org.apache.spark.deploy.yarn.Client \
  3.       --jar examples/target/scala-2.10/spark-examples-assembly-0.9.1.jar \
  4.       --class org.apache.spark.examples.SparkPi \
  5.       --args yarn-standalone \
  6.       --num-workers 3 \
  7.       --master-memory 4g \
  8.       --worker-memory 2g \
  9.       --worker-cores 1
复制代码


从输出的日志可以看出, Client在提交的时候,AM指定的是org.apache.spark.deploy.yarn.ApplicationMaster
  1. 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倒是有。

相关内容


Apache Spark源码走读之1 -- Spark论文阅读笔记

Apache Spark源码走读之2 -- Job的提交与运行

Apache Spark源码走读之3-- Task运行期之函数调用关系分析

Apache Spark源码走读之4 -- DStream实时流数据处理

Apache Spark源码走读之5-- DStream处理的容错性分析

Apache Spark源码走读之6-- 存储子系统分析

Apache Spark源码走读之7 -- Standalone部署方式分析


Apache Spark源码走读之9 -- Spark源码编译

Apache Spark源码走读之10 -- 在YARN上运行SparkPi

Apache Spark源码走读之11 -- sql的解析与执行

Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

Apache Spark源码走读之13 -- hiveql on spark实现详解

Apache Spark源码走读之14 -- Graphx实现剖析

Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析

Apache Spark源码走读之16 -- spark repl实现详解

Apache Spark源码走读之17 -- 如何进行代码跟读

Apache Spark源码走读之18 -- 使用Intellij idea调试Spark源码

Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

Apache Spark源码走读之20 -- ShuffleMapTask计算结果的保存与读取

Apache Spark源码走读之21 -- WEB UI和Metrics初始化及数据更新过程分析

Apache Spark源码走读之22 -- 浅谈mllib中线性回归的算法实现

Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

Apache Spark源码走读之24 -- Sort-based Shuffle的设计与实现


http://www.cnblogs.com/hseagle/p/3728713.html

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条