部署模式概述
Spark
支持的主要的三种分布式部署方式分别是standalone、spark on mesos和 spark on YARN
。
standalone模式
即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。它是Spark实现的资源调度框架,其主要的节点有Client节点、Master节点和Worker节点。
yarn模式
yarn是统一的资源管理机制,在上面可以运行多套计算框架,如map
reduce、storm等根据driver在集群中的位置不同,分为yarn client和yarn cluster。
mesos模式
mesos是一个更强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括yarn。
基本上,Spark
的运行模式取决于传递给SparkContext
的MASTER
环境变量的值,个别模式还需要辅助的程序接口来配合使用,目前支持的Master字符串及URL包括:
Master URL Meaning
local 在本地运行,只有一个工作进程,无并行计算能力。
local[K] 在本地运行,有K个工作进程,通常设置K为机器的CPU核心数量。
local[*] 在本地运行,工作进程数量等于机器的CPU核心数量。
spark://HOST:PORT 以Standalone模式运行,这是Spark自身提供的集群运行模式,默认端口号: 7077。
mesos://HOST:PORT 在Mesos集群上运行,Driver进程和Worker进程运行在Mesos集群上,部署模式必须使用固定值:--deploy-mode cluster。
yarn-client 在Yarn集群上运行,Driver进程在本地,Work进程在Yarn集群上,部署模式必须使用固定值:--deploy-mode client。Yarn集群地址必须在HADOOP_CONF_DIRorYARN_CONF_DIR变量里定义。
yarn-cluster 在Yarn集群上运行,Driver进程在Yarn集群上,Work进程也在Yarn集群上,部署模式必须使用固定值:--deploy-mode cluster。Yarn集群地址必须在HADOOP_CONF_DIRorYARN_CONF_DIR变量里定义。
用户在提交任务给Spark
处理时,以下两个参数
共同决定了Spark
的运行方式。
· –master MASTER_URL :决定了Spark任务提交给哪种集群处理。
· –deploy-mode DEPLOY_MODE:决定了Driver的运行方式,可选值为Client或者Cluster。
standalone框架组成
standalone
集群由三个不同级别的节点组成,分别是
- Master 主控节点,可以类比为董事长或总舵主,在整个集群之中,最多只有一个
Master
处在Active
状态 - Worker 工作节点 ,这个是manager,是分舵主, 在整个集群中,可以有多个
worker
,如果worker为零,什么事也做不了 - Executor 干苦力活的,直接受worker掌控,一个worker可以启动多个
executor
,启动的个数受限于机器中的cpu核数
在standalone
部署模式下又分为client模式
和cluster模式
,其中client模式
下,driver和client
运行于同一JVM
中,不由worker启动,该JVM进程
直到spark application
计算完成返回结果后才退出。如下图所示。
而在cluster
模式下,driver
由worker
启动,client
在确认spark application
成功提交给cluster
后直接退出,并不等待spark application
运行结果返回。如下图所示
从部署图来进行分析,每个JVM进程
在启动时的文件依赖如何得到满足。
-
Master进程
最为简单,除了spark jar包之外,不存在第三方库依赖 -
Driver
和Executor
在运行的时候都有可能存在第三方包依赖,分开来讲
Driver比较简单,spark-submit在提交的时候会指定所要依赖的jar文件从哪里读取
Executor由worker来启动,worker需要下载Executor启动时所需要的jar文件,那么从哪里下载呢。
Standalone模式下任务运行过程
- 用户通过
bin/spark-submit
部署工具或者bin/spark-class
启动应用程序的Driver进程,Driver
进程会初始化SparkContext
对象,并向Master
节点进行注册。 -
Master
节点接受Driver程序
的注册,检查它所管理的Worker
节点,为该Driver
程序分配需要的计算资源Executor
。Worker
节点完成Executor
的分配后,向Master
报告Executor
的状态。 -
Worker节点
上的ExecutorBackend进程
启动后,向Driver进程
注册。 -
Driver进程
内部通过DAG Schaduler,Stage Schaduler,Task Schaduler
等过程完成任务的划分后,向Worker节点上的ExecutorBackend
分配TASK
。 -
ExecutorBackend
进行TASK
计算,并向Driver
报告TASK状态,直至结束。 -
Driver
进程在所有TASK
都处理完成后,向Master注销。
总结
Spark
能够以standalone模式
运行,这是Spark自身提供的运行模式,用户可以通过手动启动master
和worker
进程来启动一个独立的集群,也可以在一台机器上运行这些守护进程进行测试。standalone模式
可以用在生产环境,它有效的降低了用户学习、测试Spark框架的成本。
standalone模式
目前只支持跨应用程序的简单FIFO调度
。然而,为了允许多个并发用户,你可以控制每个应用使用的资源的最大数。默认情况下,它会请求使用集群的全部CUP内核。
缺省情况下,standalone任务
调度允许worker
的失败(在这种情况下它可以将失败的任务转移给其他的worker)。但是,调度器使用master来做调度,这会产生一个单点问题:如果master
崩溃,新的应用不会被创建。为了解决这个问题,可以zookeeper
的选举机制在集群中启动多个master,也可以使用本地文件实现单节点恢复。
yarn集群模式
YARN
总体上也Master/slave架构
——ResourceManager/NodeManager
。(RM)负责对各个
NodeManager(NM)
上的资源进行统一管理和调度。
container
是资源分配和调度的基本单位,其中封装了机器资源,如内存、CPU、磁盘和网络等,每个任务会被分配一个Container,该任务只能在该Container
中执行,并使用该Container
封装的资源`。
NodeManager
的作用则是负责接收并启动应用的container
、而向RM回报本节点上的应用Container
运行状态和资源使用情况。
ApplicationMaster
与具体的Application
相关,主要负责同ResourceManage
r协商以获取合适的Container
,并跟踪这些Container
的状态和监控其进度。
如下图所示为yarn集群的一般模型。
Spark在yarn集群上的部署方式分为两种,yarn client
(driver运行在客户端)和yarn cluster
(driver运行在master上),driver on master如下图所示。
(1) Spark Yarn Client向YARN中提交应用程序,包括Application Master程序、启动Application Master的命令、需要在Executor中运行的程序等;
(2) Resource manager收到请求后,在其中一个node manager中为应用程序分配一个container,要求它在container中启动应用程序的Application Master,Application master初始化sparkContext以及创建DAG Scheduler和Task Scheduler。
(3) Application master根据sparkContext中的配置,向resource manager申请container,同时,Application master向Resource manager注册,这样用户可通过Resource manager查看应用程序的运行状态
(4) Resource manager 在集群中寻找符合条件的node manager,在node manager启动container,要求container启动executor,
(5) Executor启动后向Application master注册,并接收Application master分配的task
(6) 应用程序运行完成后,Application Master向Resource Manager申请注销并关闭自己。
Driver on client如下图所示:
(1) Spark Yarn Client向YARN的Resource Manager申请启动Application Master。同时在SparkContent初始化中将创建DAG Scheduler和TASK Scheduler等
(2) ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派
(3) Client中的SparkContext初始化完毕后,与Application Master建立通讯,向Resource Manager注册,根据任务信息向Resource Manager申请资源(Container)
(4) 当application master申请到资源后,便与node manager通信,要求它启动container
(5) Container启动后向driver中的sparkContext注册,并申请task
(6) 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己。
Yarn-client和Yarn cluster模式对比
在Yarn-client(Driver on client)中,Application Master仅仅从Yarn中申请资源给Executor,之后client会跟container通信进行作业的调度。如果client
离集群距离较远,建议不要采用此方式,不过此方式有利于交互式的作业。
总结
- 主要就是分为
standalone
模式和yarn
模式 - 每个模式又可以分为
client or cluster
模式