Spark是一个基于内存的分布式计算系统,该系统运行稳定,设计精妙,语法简洁,是很多公司首选的大数据处理系统,深入理解它的运行逻辑、工作方式对我们进行Spark开发,错误排查,性能调优都非常有帮助。Spark本身支持local,Standalone,Cluster等多种运行模式以对应不同的部署环境。其中,local运行模式适用于开发环境进行调试,可以通过参数指定单线程或者多个线程。Standalone即独立模式,是Spark本身自带的完整服务,可单独部署到一个集群中,无需依赖其他资源管理系统(如Yarn,Mesos等),通常用在生产环境。Cluster即分布式模式,Spark能够以集群的形式运行,可用的集群管理系统有Yarn、Mesos等。集群管理的核心功能是资源管理和任务调度,通常用在生产环境。本文想重点研究一下Standalone模式和Cluster模式的运行过程。
基本上,Spark的运行模式取决于传递给SparkContext的MASTER环境变量的值,个别模式还需要辅助的程序接口来配合使用,目前支持的Master字符串及URL包括:
Master URL | Meaning |
---|---|
local | 在本地运行,只有一个工作进程,无并行计算能力。 |
local[K] | 在本地运行,有K个工作进程,通常设置K为机器的CPU核心数量。 |
local[*] | 在本地运行,工作进程数量等于机器的CPU核心数量。 |
spark://HOST:PORT | 以Standalone模式运行,这是Spark自身提供的集群运行模式,默认端口号: 7077。详细文档见:Spark standalone cluster。 |
mesos://HOST:PORT | 在Mesos集群上运行,Driver进程和Worker进程运行在Mesos集群上,部署模式必须使用固定值:--deploy-mode cluster。详细文档见:MesosClusterDispatcher. |
yarn-client | 在Yarn集群上运行,Driver进程在本地,Work进程在Yarn集群上,部署模式必须使用固定值:--deploy-mode client。Yarn集群地址必须在HADOOP_CONF_DIRorYARN_CONF_DIR变量里定义。 |
yarn-cluster | 在Yarn集群上运行,Driver进程在Yarn集群上,Work进程也在Yarn集群上,部署模式必须使用固定值:--deploy-mode client。Yarn集群地址必须在HADOOP_CONF_DIRorYARN_CONF_DIR变量里定义。 |
用户在提交任务给Spark处理时,以下两个参数共同决定了Spark的运行方式。
· –master MASTER_URL :决定了Spark任务提交给哪种集群处理。
· –deploy-mode DEPLOY_MODE:决定了Driver的运行方式,可选值为Client或者Cluster。
每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行Tasks。这种Application隔离机制有其优势的,无论是从调度角度看(每个Driver调度它自己的任务),还是从运行角度看(来自不同Application的Task运行在不同的JVM中)。当然,这也意味着Spark Application不能跨应用程序共享数据,除非将数据写入到外部存储系统。
Spark与资源管理器无关,只要能够获取Executor进程,并能够保持相互通信就可以了。
提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个机架里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换;如果想在远程集群中运行,最好使用RPC将SparkContext提交给集群,不要远离Worker运行SparkContext。
用户将应用提交给Spark处理时,需要指定集群类型和Driver的运行方式。其中,集群类型包括本地,Spark Standalone,Mesos,Yarn等,Driver的运行方式则有Client和Cluster两种。集群类型决定了Spark使用资源的方式,Driver的运行方式则决定了Spark任务在运行期间Worker进程的跟踪,管理方式。
Spark Standalone模式,即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖其他资源管理系统。在该模式下,用户可以通过手动启动Master和Worker来启动一个独立的集群。其中,Master充当了资源管理的角色,Workder充当了计算节点的角色。在该模式下,Spark Driver程序在客户端(Client)运行,而Executor则在Worker节点上运行。
以下是一个运行在Standalone模式下,包含一个Master节点,两个Worker节点的Spark任务调度交互部署架构图。
从上面的Spark任务调度过程可以看到:
上面的过程反映了Spark在standalone模式下,整体上客户端、Master和Workder节点之间的交互。对于一个任务的具体运行过程需要更细致的分解,分解运行过程见图中的小字。
Spark能够以standalone模式运行,这是Spark自身提供的运行模式,用户可以通过手动启动master和worker进程来启动一个独立的集群,也可以在一台机器上运行这些守护进程进行测试。standalone模式可以用在生产环境,它有效的降低了用户学习、测试Spark框架的成本。
standalone模式目前只支持跨应用程序的简单FIFO调度。然而,为了允许多个并发用户,你可以控制每个应用使用的资源的最大数。默认情况下,它会请求使用集群的全部CUP内核。
缺省情况下,standalone任务调度允许worker的失败(在这种情况下它可以将失败的任务转移给其他的worker)。但是,调度器使用master来做调度,这会产生一个单点问题:如果master崩溃,新的应用不会被创建。为了解决这个问题,可以zookeeper的选举机制在集群中启动多个master,也可以使用本地文件实现单节点恢复。
Spark能够以集群的形式运行,可用的集群管理系统有Yarn,Mesos等。集群管理器的核心功能是资源管理和任务调度。以Yarn为例,Yarn以Master/Slave模式工作,在Master节点运行的是Resource Manager(RM),负责管理整个集群的资源和资源分配。在Slave节点运行的Node Manager(NM),是集群中实际拥有资源的工作节点。我们提交Job以后,会将组成Job的多个Task调度到对应的Node Manager上进行执行。另外,在Node Manager上将资源以Container的形式进行抽象,Container包括两种资源内存和CPU。
以下是一个运行在Yarn集群上,包含一个Resource Manager节点,三个Node Manager节点(其中,两个是Worker节点,一个Master节点)的Spark任务调度交换部署架构图。
从上面的Spark任务调度过程图可以看到:
上面的过程反映出了Spark在集群模式下,整体上Resource Manager和Node Manager节点间的交互,Master和Worker之间的交互。对于一个任务的具体运行过程需要更细致的分解,分解运行过程见图中的小字。
Spark能够以集群的方式运行,这里的可选集群有Yarn和Mesos。在集群模式下,Spark的Driver程序可能被调度到任何一个节点,任务执行完成后,集群分配的资源将被回收。
http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/
http://colobu.com/2014/12/09/spark-standalone-mode/
https://spark.apache.org/docs/latest/spark-standalone.html
http://spark-internals.books.yourtion.com/markdown/1-Overview.html