部署模式概述

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的运行模式取决于传递给SparkContextMASTER环境变量的值,个别模式还需要辅助的程序接口来配合使用,目前支持的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集群由三个不同级别的节点组成,分别是

  1. Master 主控节点,可以类比为董事长或总舵主,在整个集群之中,最多只有一个Master处在Active状态
  2. Worker 工作节点 ,这个是manager,是分舵主, 在整个集群中,可以有多个worker,如果worker为零,什么事也做不了
  3. Executor 干苦力活的,直接受worker掌控,一个worker可以启动多个executor,启动的个数受限于机器中的cpu核数

standalone部署模式下又分为client模式cluster模式,其中client模式下,driver和client运行于同一JVM中,不由worker启动,该JVM进程直到spark application计算完成返回结果后才退出。如下图所示。

spark可以不依赖hadoop单独部署 spark支持多种部署方式_standalone

而在cluster模式下,driverworker启动,client在确认spark application成功提交给cluster后直接退出,并不等待spark application运行结果返回。如下图所示

spark可以不依赖hadoop单独部署 spark支持多种部署方式_standalone_02

从部署图来进行分析,每个JVM进程在启动时的文件依赖如何得到满足。

  1. Master进程最为简单,除了spark jar包之外,不存在第三方库依赖
  2. DriverExecutor在运行的时候都有可能存在第三方包依赖,分开来讲

Driver比较简单,spark-submit在提交的时候会指定所要依赖的jar文件从哪里读取
Executor由worker来启动,worker需要下载Executor启动时所需要的jar文件,那么从哪里下载呢。

Standalone模式下任务运行过程

  1. 用户通过bin/spark-submit部署工具或者bin/spark-class启动应用程序的Driver进程,Driver进程会初始化SparkContext对象,并向Master节点进行注册。
  2. Master节点接受Driver程序的注册,检查它所管理的Worker节点,为该Driver程序分配需要的计算资源ExecutorWorker节点完成Executor的分配后,向Master报告Executor的状态。
  3. Worker节点上的ExecutorBackend进程启动后,向Driver进程注册。
  4. Driver进程内部通过DAG Schaduler,Stage Schaduler,Task Schaduler等过程完成任务的划分后,向Worker节点上的ExecutorBackend分配TASK
  5. ExecutorBackend进行TASK计算,并向Driver报告TASK状态,直至结束。
  6. Driver进程在所有TASK都处理完成后,向Master注销。

总结

Spark能够以standalone模式运行,这是Spark自身提供的运行模式,用户可以通过手动启动masterworker进程来启动一个独立的集群,也可以在一台机器上运行这些守护进程进行测试。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相关,主要负责同ResourceManager协商以获取合适的Container,并跟踪这些Container的状态和监控其进度。

如下图所示为yarn集群的一般模型。

spark可以不依赖hadoop单独部署 spark支持多种部署方式_cluster_03

Spark在yarn集群上的部署方式分为两种,yarn client(driver运行在客户端)和yarn cluster(driver运行在master上),driver on master如下图所示。

spark可以不依赖hadoop单独部署 spark支持多种部署方式_spark_04

(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如下图所示:

spark可以不依赖hadoop单独部署 spark支持多种部署方式_standalone_05

(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离集群距离较远,建议不要采用此方式,不过此方式有利于交互式的作业。

spark可以不依赖hadoop单独部署 spark支持多种部署方式_应用程序_06

总结

  • 主要就是分为standalone模式和yarn模式
  • 每个模式又可以分为client or cluster模式