Spark 原理与实战之部署模式与运行机制
前言:
Spark 的运行模式指的是 Spark 应用程序以怎样的方式运行,单节本地点运行还是多节点集群运行,自己进行资源调度管理还是依靠别人进行调度管理。Spark 提供了多种多样,灵活多变的部署模式。
一、部署模式
这是 spark 官方给出的 master 的配置选项,也从另一个侧面说明了 spark 的不同部署和运行模式。
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 模式运行机制
这张图表示的是 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 模式运行机制
这是 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 的部署模式及其运行机制,你就对 spark 的认识又有了一步质的提高,当然理论与实践还是会有差别,不同部署模式可能会出现一些不兼容的问题,我们还是需要多动手运行,从实践中掌握更多。
版权声明: 本文为 InfoQ 作者【小舰】的原创文章。
原文链接:【http://xie.infoq.cn/article/9c032a7cce8bd8c3a485e5f54】。文章转载请联系作者。
评论