前言:

Spark的运行模式指的是Spark应用程序以怎样的方式运行,单节本地点运行还是多节点集群运行,自己进行资源调度管理还是依靠别人进行调度管理。Spark提供了多种多样,灵活多变的部署模式。

一、部署模式

这是spark官方给出的master的配置选项,也从另一个侧面说明了spark的不同部署和运行模式。




spark shell sc spark shell sc shutdown_运行机制


Spark部署模式总体来讲可以分为以下几种:

Local:这种模式一般用在本地IDEA中调试运行使用,在进行spark实例创建的时候指定master为local,其中local为利用本节点单核单线程运行,local[n]为n核多线程运行;

方式:./spark-shell - -master local[n] ,n代表线程数

Standalone:即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。从一定程度上说,该模式是其他两种的基础。目前Spark在standalone模式下是没有任何单点故障问题的,这是借助zookeeper实现的。

Yarn/Mesos:这其实可以理解为依靠第三方资源管理器来进行资源管理的部署方式:Mesos是官方推荐的一种部署模式,由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。但是由于Hadoop生态的完善发展,大部分的企业都是将Spark作为组件引入到了Hadoop生态中,因此更多的是借助Yarn来进行资源管理。这是一种很有前景的部署模式。

Yarn部署模式下,又根据driver启动在本地(client)还是在Yarn集群内部的AM中(cluster)中分为以下两种:

1) yarn-cluster:适用于生产环境;

2) yarn-client:适用于交互、调试,希望立即看到app的输出

Kubernetes:一个开源系统,用于自动化、容器化应用程序的部署,扩展和管理。随着容器化技术的发展,如果考虑到平台上云,或者有时候为了更好的动态扩展、资源隔离的时候,可以采用容器化部署的方式。

二、运行机制

spark运行最重要的概念包括sparkcontext以及executor,SparkContext中包含了划分stage的DAGScheduler和划分task的TaskScheduler,executor具体来接收task然后创建线程池来进行运行。对于不同的模式,这里面的资源申请和任务调度稍有不同,我们用两种最常用的模式来进行分析。

standalone模式运行机制


spark shell sc spark shell sc shutdown_spark_02


这张图表示的是standalone模式下的运行流程。上面虽然标了1-6个步骤,但是我大体可以将其分为三个步骤:

1.资源申请:在该模式下,Client中创建了SparkContext(简称SC),SC向master注册并申请资源,master管理了多个worker节点,通过心跳可以时刻备案哪些worker有资源,然后将有空闲的worker挑选出来,创建Executor,分配给SC(Executor会向SC报道)

2.任务运行:在Executor向SC报道之后,SC就知道可以在它上面运行具体任务了,就会将任务进行分解,先分解成Stage,然后进一步分解出task,发送到Executor中执行;Executor创建线程池,来运行这些任务,并及时向SC汇报执行情况;

3.任务注销:当任务执行完毕,SC向master进行注销操作

Yarn模式运行机制


spark shell sc spark shell sc shutdown_运行机制_03


这是yarn模式下,准确的说是yarn-client模式(因为SparkContext在Client中所以为yarn-client)下的运行流程。

这张图也是标记了1-6多个步骤,我依然给分为三个阶段:

1.资源申请:Yarn模式跟Standalone模式最大的区别就是,资源不是由spark自己管理,而是依赖第三方资源管理器进行管理,因此资源申请就要更费劲一点。首先,client中创建了SparkContext(SC),为了找到能够帮它创建Executor的master,它需要先向ResourceManager(用了Yarn,RM就是新的老大)申请创建ApplicationMaster(简称AM),RM会在各个NodeManager(简单理解为节点,简称NM)中找一个空闲的container(Yarn资源管理模式下的最小的资源申请单位)来启动AM。有了AM,AM就可以向RM申请NM来为SC创建Executor啦,同样,Executor在启动之后会向SC注册并申请task;

2.任务运行:有了Executor,基本就跟Standalone模式差不多了,在Executor向SC报道之后,SC就知道可以在它上面运行具体任务了,就会将任务进行分解,先分解成Stage,然后进一步分解出task,发送到Executor中执行;Executor创建线程池,来运行这些任务,并及时向SC汇报执行情况;

3.任务注销:任务运行完成之后,client的SC向RM注销自己并关闭自己

上面讲了两种重要部署模式下的运行机制,如果是yarn-cluster会是怎样的逻辑呢,其实如果你理解了以上两种运行方式,这个也就能自己推理出来了,放一张图自己试试看(tips:只是driver从client跑到了ApplicationMaster节点了而已)。


spark shell sc spark shell sc shutdown_运行机制_04


总结:

了解了spark的部署模式及其运行机制,你就对spark的认识又有了一步质的提高,当然理论与实践还是会有差别,不同部署模式可能会出现一些不兼容的问题,我们还是需要多动手运行,从实践中掌握更多。