spark整体概述

Spark整体概述

1.1整体概念

  Apache Spark是一个开源的通用集群计算系统,他提供了High-level编程API,支持Scala,Java和Python三种编程语言。Spark内核使用scala编写,通过基于Scalade 函数式编程特性,在不同的计算层面进行抽象。

1.2 RDD抽象

  RDD(Resilient Distributer Datasets),弹性分布式数据集,是对分布式数据集的一种内存抽象,通过受限的共享内存方式来提供容错性,同时这种内存模型使计算比传统数据流模型高效。RDD具有5个特性,如下图

spark整体概述

 

上图展示了2个RDD进行JOIN操作,体现了RDD所具备的5个主要特性,如下所示:

1)一组分区

2)计算每一个数据分片的函数

3)RDD上的一组依赖

4)可选,对于键值对RDD,有一个Partitioner(通常是HashPartitioner)

5)可选,一组Preferred location信息(例如,HDFS文件的Block所在location信息)有了上述特性,能够非常好地通过RDD来表达分布式数据集,并作为构建DAG图的基础:首先抽象一次分布式计算任务的逻辑表示,最终将任务在实际的物理计算环境中进行处理执行。

有了上述特性,能够非常好地通过RDD来表达分布式数据集,并作为构建DAG图的基础:首先抽象一次分布式计算任务的逻辑表示,最终将任务在实际的物理计算环境中进行处理执行。

1.3计算抽象

在描述Spark中的计算抽象,我们首先需要了解如下几个概念:

1)Application用户编写的Spark程序,完成一个计算任务的处理。它是由一个Driver程序和一组运行于Spark集群上的Executor组成。

2)Job用户程序中,每次调用Action时,逻辑上会生成一个Job,一个Job包含了多个Stage。

3)Stage Stage 包括两类:ShuffleMapStage 和ResultStage,如果用户程序中调用了需要进行Shuffle计算的Operator,如groupByKey等,就会以Shuffle为边界分成ShuffleMapStage和ResultStage。

4)TaskSet基于Stage可以直接映射为TaskSet,一个TaskSet封装了一次需要运算的、具有相同处理逻辑的Task,这些Task可以并行计算,粗粒度的调度是以TaskSet为单位的。

5)Task Task是在物理节点上运行的基本单位,Task包含两类:ShuffleMapTask和ResultTask,分别对应于Stage中ShuffleMapStage和ResultStage中的一个执行基本单元。

下面,我们看一下,上面这些基本概念之间的关系,如下图所示:

spark整体概述

 

上图,为了简单,每个Job假设都很简单,并且只需要进行一次Shuffle处理,所以都对应2个Stage。实际应用中,一个Job可能包含若干个Stage,或者是一个相对复杂的Stage DAG。

在Standalone模式下,默认使用的是FIFO这种简单的调度策略,在进行调度的过程中,大概流程如下图所示:

spark整体概述

 

 

从用户提交Spark程序,最终生成TaskSet,而在调度时,通过TaskSetManager 来管理一个TaskSet(包含一组可在物理节点上执行的Task),这里面TaskSet必须要按照顺序执行才能保证计算结果的正确性,因为TaskSet之间是有序依赖的(上溯到ShuffleMapStage和ResultStage),只有一个TaskSet中的所有Task都运行完成后,才能调度下一个TaskSet中的Task去执行。

1.4集群模式

Spark集群在设计的时候,并没有在资源管理的设计上对外封闭,而是充分考虑了未来对接一些更强大的资源管理系统,如YARN、Mesos等,所以Spark架构设计将资源管理单独抽象出一层,通过这种抽象能够构建一种适合企业当前技术栈的插件式资源管理模块,从而为不同的计算场景提供不同的资源分配与调度策略。Spark集群模式架构,如下图所示:

spark整体概述

 

1)Standalone模式

Standalone模式是Spark内部默认实现的一种集群管理模式,这种模式是通过集群中的Master来统一管理资源,而与Master进行资源请求协商的是Driver内部的StandaloneSchedulerBackend(实际上是其内部的StandaloneAppClient真正与Master通信),后面会详细说明。

2)YARN模式

YARN模式下,可以将资源的管理统一交给YARN集群的ResourceManager去管理,选择这种模式,可以更大限度的适应企业内部已有的技术栈,如果企业内部已经在使用Hadoop技术构建大数据处理平台。

3)Mesos模式

随着Apache Mesos的不断成熟,一些企业已经在尝试使用Mesos构建数据中心的操作系统(DCOS),Spark构建在Mesos之上,能够支持细粒度、粗粒度的资源调度策略(Mesos的优势),也可以更好地适应企业内部已有技术栈。

那么,Spark中是怎么考虑满足这一重要的设计决策的呢?也就是说,如何能够保证Spark非常容易的让第三方资源管理系统轻松地接入进来。我们深入到类设计的层面看一下,如下图类图所示:

spark整体概述

 

可以看出,Task 调度直接依赖SchedulerBackend,SchedulerBackend与实际资源管理模块交互实现资源请求。这里面,CoarseGrainedSchedulerBackend是Spark中与资源调度相关的最重要的抽象,它需要抽象出与TaskScheduler通信的逻辑,同时还要能够与各种不同的第三方资源管理系统无缝地交互。实际上,CoarseGrainedSchedulerBackend 内部采用了一种ResourceOffer的方式来处理资源请求。

1.5RPC网络通信

Spark RPC层是基于优秀的网络通信框架Netty设计开发的,但是Spark提供了一种很好地抽象方式,将底层的通信细节屏蔽起来,而且也能够基于此来设计满足扩展性,比如,如果有其他不基于Netty的网络通信框架的新的RPC接入需求,可以很好地扩展而不影响上层的设计。RPC层设计,如下图类图所示:

spark整体概述

 

 

任何两个Endpoint只能通过消息进行通信,可以实现一个RpcEndpoint和一个RpcEndpointRef:想要与RpcEndpoint通信,需要获取到该RpcEndpoint对应的RpcEndpointRef即可,而且管理RpcEndpoint和RpcEndpointRef创建及其通信的逻辑,统一在RpcEnv对象中管理。

1.6启动流程

spark整体概述

 

1.7Block管理

Block管理,主要是为Spark 提供的Broadcast 机制提供服务支撑的。Spark中内置采用TorrentBroadcast 实现,该Broadcast变量对应的数据(Task数据)或数据集(如RDD),默认会被切分成若干4M大小的Block,Task运行过程中读取到该Broadcast变量,会以4M为单位的Block为拉取数据的最小单位,最后将所有的Block合并成Broadcast变量对应的完整数据或数据集。将数据切分成4M大小的Block,Task从多个Executor拉取Block,可以非常好地均衡网络传输负载,提高整个计算集群的稳定性。

1.8整体应用

用户通过spark-submit提交或者运行spark-shellREPL,集群创建Driver,Driver加载Application,最后Application根据用户代码转化为RDD,RDD分解为Tasks,Executor执行Task等系列知识,整体交互蓝图如下:

spark整体概述

 

1)Client运行时向Master发送启动驱动申请(发送RequestSubmitDriver指令)

2)Master调度可用Worker资源进行驱动安装(发送LaunchDriver指令)

3)Worker运行DriverRunner进行驱动加载,并向Master发送应用注册请求(发送RegisterApplication指令)

4)Master调度可用Worker资源进行应用的Executor安装(发送LaunchExecutor 指令)

5)Executor 安装完毕后向Driver注册驱动可用Executor资源(发送RegisterExecutor指令)

6)最后是运行用户代码时,通过DAGScheduler,TaskScheduler封装为可以执行的TaskSetManager对象

7)TaskSetManager对象与Driver中的Executor资源进行匹配,在队形的Executor中发布任务(发送LaunchTask指令)

8)TaskRunner执行完毕后,调用DriverRunner提交给DAGScheduler,循环7.直到任务完成