部署模式概述
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
模式