基础概念 之 Spark on Yarn

Posted xxiaolige

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础概念 之 Spark on Yarn相关的知识,希望对你有一定的参考价值。

先抛出问题:Spark on Yarn有cluster和client两种模式,它们有什么区别? 用Jupyter写Spark时,只能使用client模式,为什么?

写一篇文章,搞清楚 Spark on Yarn 的运行原理,同时回答上面的问题。

首先,把Spark和Yarn当做两个独立概念来看。单看Spark,不去管它底层依赖的存储结构,本质上讲,它就是个分布式计算的程序。程序的入口是一个叫做 SparkContext 的对象,也可以抽象地称为Driver,启动了 SparkContext 后,就可以运行各种Spark方法(比如 map,filter)。运行方法时,Spark会把每次执行分解成若干个Task,分发给若干个Executor执行,Executor是执行Task的进程,执行后的结果汇总到一起,返回给 SparkContext。Spark 本质上也是一个map+reduce的过程,与Hadoop不同的是,Spark会先把数据存储到内存中,这样处理速度会比Hadoop快大约两个数量级。

这么多的Executor进程是怎么来的?

是Yarn分配的。(注:还有其他资源管理框架,比如 Moses,这里先不管它。)

再次强调,Spark只是一套可以运行的代码,代码运行是需要资源的(计算、存储、网络),Yarn是给Spark提供运行资源的。

Yarn本身的运行方式是:Yarn把集群的节点分为两类,一类是Master,运行的进程叫ResourceManager(简称RM),另一类是Worker,运行的进程叫NodeManager(简称NM),NM可以在本机内分配资源,生成若干个Container(不熟悉容器的同学可以把Container近似理解为虚拟机)。Yarn的运行过程是,RM接受外部的资源申请(可以来自Hadoop、Spark或其他进程),按照要求分配资源,然后把对应的资源分配计划通知各个NM,NM收到自己的分配计划,按计划在本地启动若干个Container。

Spark和Yarn各自介绍完毕。

 

Spark on Yarn就是把上述过程结合起来,Yarn在底层,Spark在上层,也就是说,我们在写Spark代码时不需要操作Yarn,只需要设置好Spark的资源参数,Yarn会按照Spark的资源参数去分配资源,然后提供给Spark使用。

Spark on Yarn 的运行过程是:SparkContext运行起来,设置资源参数,Yarn中会为每个Spark App启动一个Container,叫做App Master,由App Master把资源参数发送给RM,RM通知若干个NM,启动若干个Container,每个Container内部都运行一个Executor,对,就是Spark中的Executor,这样Spark 和 Yarn 就结合起来了。

这里给出一个Spark on Yarn的资源参数配置示例:

conf = SparkConf().setMaster(yarn-client).setAppName(test)
conf.set(spark.executor.instances,10)
conf.set(spark.executor.cores,1)
conf.set(spark.executor.memory,2g)
conf.set("spark.driver.memory", "2g")
conf.set("spark.driver.maxResultSize", "0")

 

Spark on Yarn的原理都清楚了,下面要解决开头提出的问题了:Spark on Yarn 的 cluster 和 client 模式有什么区别?为什么Jupyter只能用client模式?

对比cluster和client,从名字就可以看出,前者是分布式的,后者是本地化的。具体区别就在于上面的红字:App Master的作用不同。

在cluster模式中,SparkContext运行在App Master所在的Container中,也就是说,在初始化Spark程序时,我们不知道SparkContext会运行在哪个节点,由RM分配一个Container作为App Master后,SparkContext运行在这个Container中,Spark程序的运行与我们在哪个节点启动它没有关系。

相对地,在client模式中,SparkContext运行在启动SparkContext的节点上,所有与Spark有关的调度工作都在这个节点上运行(注意:不是在这个节点的Container上),App Master只在向RM申请资源时起到了作用,之后就它什么事了,除非资源需要发生变化。

到这里,我们就能明白为什么Jupyter必须使用client模式了,因为Jupyter是运行在节点上的进程,只能和本地节点的内存实现数据交互。(跨节点内存交互也不是完全不可能,但是基本没用。)

 

 

参考资料:

https://www.cnblogs.com/tgzhu/p/5818374.html

以上是关于基础概念 之 Spark on Yarn的主要内容,如果未能解决你的问题,请参考以下文章

Spark基础:Spark on Yarn(上)

spark远程debug之调试spark on yarn 程序

spark-on-yarn 学习

Spark基础学习笔记06:搭建Spark On YARN模式的集群

:环境搭建-Spark on YARN

Spark On Yarn部署