文章目录

  • 一、Spark是什么
  • 二、运行架构
  • 三、核心组件
    • 3.1、Driver
    • 3.1、Executor
    • 3.2、Master&Worker
    • 3.3、ApplicationMaster
  • 四、核心模块
  • 五、核心概念
    • 5.1、Executor
    • 5.2、并行度(Parallelism)
    • 5.3、有向无环图(DAG)
  • 六、提交流程
    • 6.1、Yarn Client模式
    • 6.2、Yarn Cluster模式

一、Spark是什么

  • Spark 是用于大规模数据处理的统一分析引擎。
  • 可以对结构化、半结构化、非结构化等各种类型的数据数据结构进行自定义计算。
  • 也支持Python、Java、Scala、R以及SQL语言去开发应用程序计算数据。


Spark借鉴了MapReduce思想发展而来,保留了其分布式并行计算得优点并改进了其明显的缺陷。让中间数据存储在内存中提高了运行速度、并提供丰富的操作数据的API提高了开发速度。

二、运行架构

Spark框架的核心是一个计算引擎,整体来说,它采用了标准的master-slave的结构
图所示:展示了一个Spark执行时的基本架构,图中的Driver表示master,负责管理整个集群中的作业任务调度。图中的Executor则是slave,负责实际执行任务。
Spark运行架构由三个主要组件组成:Driver节点、Cluster Manager和Executor节点。

  1. Driver节点是应用程序的入口点,它负责解析用户的应用程序代码,并将任务划分成一系列的任务(stage),以及在集群上为任务安排调度。Driver节点负责管理各个任务之间的依赖关系,并将它们转换成一个可执行的物理执行计划(DAG)
  2. Cluster Manager负责在集群中为应用程序分配资源。它可以是Standalone,YARN或Mesos等。
  3. Executor节点负责在工作节点上执行任务。每个Executor都运行在自己的JVM进程中,并且为应用程序分配了一定数量的内存和CPU资源。Executor在运行过程中负责接收和执行任务。

三、核心组件

3.1、Driver

Spark驱动器节点,用于执行Spark任务中的main方法,负责实际代码的执行工作。
Driver在Spark作业执行时主要负责:

  • 将用户程序转化为作业(job)
  • 在Executor之间调度任务(task)
  • 跟踪Executor的执行情况
  • 通过UI展示查询运行情况

事实上,我们无法描述Driver的定义,因为在整个编程过程中没有看到任何有关Driver到的字眼,所以简单理解,所谓的Driver就是驱使整个应用运行起来的程序,也称为:Driver类。

3.1、Executor

Spark Executor是集群中工作节点(Worker)中的一个JVM进程,负责在Spark作业中运行具体任务(Task),任务彼此之间相互独立。Spark应用启动时,Executor节点被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。如果Executor节点发生了故障或崩溃,Spark应用也可以继续执行,会将出错节点上的任务调度到其他的Executor节点上继续运行。
Executor有两个核心功能:

  • 负责运行组成Spark应用的任务,并将结果返回给驱动器进程。
  • 它们通过自身的块管理(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

3.2、Master&Worker

Spark集群的独立部署环境中,不需要依赖其他的资源调度框架,自身就实现了资源调度的功能,所以环境中还有其他两个核心组件:Master和Worker,这里的Master是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责,类似于Yarn环境中的RM,而Worker,也是进程,一个Worker运行在及群众的一台服务器上,由Master分配资源对数据进行并行的处理和计算,类似于Yarn环境中的NM。

3.3、ApplicationMaster

在Spark on Yarn模式下,ApplicationMaster是一个管理运行在YARN集群上的SparkApplication的核心组件。当用户提交一个SparkApplication时,YARN ResourceManager会为该Application分配一个ApplicationMaster。
ApplicationMaster负责以下任务:

  • 申请和分配资源:ApplicationMaster向YARN ResouceManager请求资源,例如CPU和内存。在申请资源时,它会考虑当前集群资源的可用性和已经申请的资源。一旦资源被分配,ApplicationMaster会通过Spark Driver向集群中的Executor发起任务。
  • 监控任务:一旦Executor启动,ApplicationMaster会持续监控Executor的状态,并在Executor失效或异常退出时进行处理。
  • 与Driver通信:ApplicationMaster与Spark Driver之间通过RPC协议通信,用于任务的调度,监控以及结果的收集。

四、核心模块

  • Spark Core:Spark的基础组件,提供了分布式任务调度、内存管理、错误恢复和存储系统的交互等功能
  • Spark SQL:Spark的结构化数据处理组件,支持SQL查询和与外部数据源的集成,还提供了DataFrame和DataSet API,用于以编程方式处理结构化数据。
  • Spark Streaming:Spark的流处理组件,支持以近实时的方式处理流式数据。
  • MLlib:Spark的机器学习库,提供了常见的机器学习算法和工具。
  • GraphX:Spark的图计算库,提供了图处理算法和工具。

五、核心概念

5.1、Executor

  • 在Spark中,Executor是运行在集群节点上的工作进程,用于执行任务和计算数据。每个应用程序都会在集群上启动一些Executor,这些Executor会在需要的时候启动或停止,以适应应用程序的负载。
  • 每个Executor都是一个JVM进程,它们之间是互相独立的,不共享内存,通过网络进行通信。Executor从Driver接收任务,然后将任务分配给自己的线程池进行执行。在执行过程中,Executor可以从Driver处请求数据,并在处理完数据后将结果返回给Driver
  • Executor的数量和大小可以通过配置文件进行设置,具体的设置会根据应用程序的需求而不同。Executor的数量和大小决定了应用程序的并行度和吞吐量,因此需要根据实际情况进行调整。

修改应用程序相关启动参数

名称说明
–num-executors配置Executor的数量
–executor-memory配置每个Executor的内存大小
–executor-cores配置每个Executor的虚拟CPU core数量

5.2、并行度(Parallelism)

在Spark中,并行度(Parallelism)指的是在同一时间内可以同时处理的任务数量。在Spark中,并行度可以通过调整分区(partition)数来控制。一个RDD的分区数决定了该RDD能够被同时处理的任务数量进而影响Spark作业的执行效率。
如果RDD中的分区数量小于集群中的CPU核心数量,则可能无法充分利用集群中的CPU核心数量,则可以导致任务键频繁地发生切换,从而也会降低Spark作业的执行效率。
因此,对于一个RDD,我们需要根据数据的规模、处理复杂度、计算资源等因素来确定合适的分区数,以充分利用集群中的资源,提高Spark作业的执行效率。可以通过repartition()和coalesce()等方法来调整RDD的分区数。

5.3、有向无环图(DAG)

在Spark中,DAG代表着一个有向无环图(Directed Acyclic Graph),它被用来表示Spark中的各种数据转换和动作操作。DAG中的节点代表着数据源(如RDD)、中间转换操作(如map、filter等)和行动操作(如count、collect等),代表着依赖关系。
当Spark应用程序执行时,每个RDD都可以看作一个节点,RDD之间的依赖关系可以看作边。Spark通过构建DAG来进行作业调度,以确定哪些任务需要在哪个节点上执行。Spark通过构建DAG来进行作业调度,以确定哪些任务需要在哪个节点上执行。Spark会将DAG拆分为多个阶段(stage),每个阶段包含一组可以并行执行的任务。每个阶段都有一个特定的数据划分和计算任务,通常涉及一个或多个父RDD到一个或多个子RDD的转换。
在DAG执行过程中,Spark会先执行所有父RDD的所有任务,然后再执行子RDD的任务,以确保数据在计算过程中的正确传递。Spark使用DAG调度器来确定如何拆分为DAG为多个阶段,并将任务分配给可用的执行器节点,以实现高效的任务并行执行。

六、提交流程

6.1、Yarn Client模式

Client模式将用于监控和调度的Driver模块在客户端执行,而不是Yarn中,所以一般用于测试

  1. Driver在任务提交的本地机器上运行。
  2. Dirver启动后会和ResourceManager通讯申请启动ApplicationMaster。
  3. ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,负责向ResourceManager申请过Executor内存。
  4. ResouceManager接到ApplicationMaster的资源申请后会分配container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程
  5. Executor进程启动后会向Driver反向注册,Executor全部注册完成后Dirver开始执行main函数。
  6. 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分stage,每个stage生成对应的TaskSet,之后将task分发到各个Executor上执行。

6.2、Yarn Cluster模式

Cluster模式将用于监控和调度的Driver模块启动在Yarn集群资源中执行。一般应用于实际生产环境。

  1. 在Yarn Cluster模式下,任务提交后会和ResouceManager通讯申请启动ApplicationMaster。
  2. 随后ResouceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver。
  3. Driver启动后向ResouceManager申请Executor内存,ResouceManager接到ApplicationMaster的资源申请后会分配container,然后在合适的NodeManager上启动Executor进程。
  4. Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数。
  5. 之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分stage,每个stage生成对应的TaskSet,之后将task分发到各个Executor上执行。