Spark运行架构 :
运行架构
Spark 采用master - slave(主从)结构。Driver 相当于master,负责管理集群中的作业任务调度;Executor 相当于slave,负责实际执行任务
核心组件
Driver:是Spark驱动器节点,执行Spark任务中的main方法,负责实际代码执行。作业执行时,它将用户程序转化为作业,在Executor间调度任务,跟踪Executor执行情况,还通过UI展示运行情况。可简单理解为驱使应用运行的程序(Driver类) 。
Executor:进程属性:Spark Executor 是集群工作节点(Worker)中的JVM进程 。
任务执行:负责在Spark作业里运行具体任务(Task),任务相互独立。Spark应用启动时它随之启动,贯穿应用生命周期。即便有Executor节点故障崩溃 ,Spark应用能将出错节点任务调度到其他Executor继续执行。
核心功能
执行Spark应用任务并把结果返回给Driver进程。
借助自身块管理器(Block Manager)为需缓存的RDD提供内存存储,RDD缓存在Executor进程内,利于任务利用缓存数据加速运算。
Master & Worker
Spark 独立部署:在Spark集群独立部署环境下,无需依赖其他资源调度框架,自身实现资源调度。
Master:作为一个进程,负责资源调度分配以及集群监控,类似Yarn环境中的ResourceManager(RM) 。
Worker:也是进程,运行在集群的一台服务器上,由Master分配资源来并行处理计算数据,类似Yarn环境中的NodeManager(NM) 。
ApplicationMaster
Hadoop - YARN 场景:Hadoop用户向YARN集群提交应用程序时,程序需包含ApplicationMaster 。
功能职责:用于向资源调度器申请执行任务的资源容器(Container) ,运行用户程序任务(job) ,监控任务执行、跟踪任务状态,处理任务失败等异常情况 。它起到ResourceManager(资源)与Driver(计算)之间解耦合的作用。
核心概念:
Executor与Core
Spark Executor是集群工作节点中的JVM进程,专门用于计算 。提交应用时,可通过参数指定其数量,以及每个Executor的内存大小、虚拟CPU核(Core)数量 ,相关启动参数如下:
- num - executors:配置Executor的数量。
-executor - memory:配置每个Executor的内存大小。
-executor - cores:配置每个Executor的虚拟CPU core数量。
并行度(Parallelism)
在分布式计算框架中,多个任务可在不同计算节点同时执行,实现多任务并行执行(注意是并行而非并发) 。集群并行执行任务的数量即并行度,其数值取决于框架默认配置,应用程序运行中也可动态修改。
有向无环图(DAG)
计算引擎分类背景:大数据计算引擎框架按使用方式分四类,Hadoop的MapReduce将计算分Map和Reduce两个阶段,上层应用常需拆分算法、串联多个Job完成完整算法,存在弊端。
DAG框架产生:为解决上述问题,催生了支持DAG的框架,被划分为第二代计算引擎,如Tez及上层的Oozie ,不过大多还是批处理任务。
第三代计算引擎(以Spark为代表 ):特点是支持Job内部的DAG(不跨越Job)以及实时计算 。这里的有向无环图不是真正图形,是Spark程序逻辑映射出的数据流高级抽象模型。
Spark应用程序在Yarn环境中的提交流程
有向无环图(DAG)定义
DAG(Directed Acyclic Graph)即有向无环图,是由点和线组成的拓扑图形,具备方向性且不会形成闭环 。
Spark应用程序提交流程
指开发人员编写的应用程序通过Spark客户端提交到Spark运行环境执行计算的流程 。国内工作中Spark多部署到Yarn环境,这里介绍基于Yarn环境的提交流程。
部署执行方式
Spark应用程序提交到Yarn环境执行时有Client和Cluster两种模式 ,主要区别在于Driver程序的运行节点位置:
Yarn Client模式:用于监控和调度的Driver模块在客户端(任务提交的本地机器)执行,常用于测试 。Driver启动后会与ResourceManager通讯申请启动。
ApplicationMaster相关流程
ResourceManager分配container ,在合适的NodeManager上启动ApplicationMaster ,它负责向ResourceManager申请Executor内存。
ResourceManager接到ApplicationMaster的资源申请后分配container ,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程。
该文档围绕Spark Core中RDD展开,涵盖定义、属性、执行原理、序列化、依赖关系、持久化、分区器以及文件读取与保存等内容,旨在深入介绍RDD在Spark数据处理中的核心作用与相关知识。
RDD基础概念
- 定义:RDD即弹性分布式数据集,是Spark基本数据处理模型,为抽象类,代表弹性、不可变、可分区且元素可并行计算的集合。“弹性”体现在存储、容错、计算和分片等方面;“分布式”指数据存储在集群不同节点;“数据集”说明其封装计算逻辑但不保存数据 。
- 核心属性:包含分区列表、分区计算函数、RDD间依赖关系、分区器(K-V数据时可选)和首选位置(可选),这些属性在分布式计算、任务调度和数据处理中起关键作用。
执行原理:在Yarn环境中,Spark先启动集群、申请资源创建调度和计算节点,再划分任务,最后由调度节点将任务发送到计算节点执行,RDD在其中负责封装逻辑并生成任务。
RDD序列化
闭包检查:算子外代码在Driver端执行,算子内代码在Executor端执行,使用算子外数据形成闭包,需检测闭包内对象能否序列化,防止执行错误。
序列化方法和属性:与闭包检查相关,强调算子内外代码执行位置不同带来的序列化问题。
Kryo序列化框架:Spark 2.0起支持,比Java序列化快10倍,用于Shuffle时简单数据类型、数组和字符串的序列化,使用时仍需继承Serializable接口。
RDD依赖关系
血缘关系:RDD记录创建的Lineage,用于恢复丢失分区,其元数据和转换行为可帮助重新运算丢失数据。
依赖类型:窄依赖指父RDD分区最多被一个子RDD分区使用;宽依赖指父RDD分区被多个子RDD分区依赖,会引发Shuffle。
阶段和任务划分:DAG记录RDD转换和任务阶段,Application、Job、Stage和Task构成层次关系,一个Action算子生成一个Job,Stage数由宽依赖个数加1决定,Task个数取决于Stage中最后一个RDD的分区数。
RDD持久化
Cache缓存:通过Cache或Persist方法缓存计算结果,默认存于JVM堆内存,action算子触发时缓存,缓存丢失可重算丢失部分,Spark会自动持久化部分Shuffle中间数据。
CheckPoint检查点:将RDD中间结果写入磁盘,用于降低血缘依赖过长的容错成本,需Action操作触发。
区别:Cache不切断血缘依赖,数据存储可靠性低;Checkpoint切断血缘依赖,数据存储在高可靠文件系统,建议对Checkpoint的RDD使用Cache缓存以提高效率。
RDD分区器:Spark支持Hash分区(默认)、Range分区和自定义分区,分区器决定RDD分区个数、数据Shuffle后的分区走向及Reduce个数,仅Key - Value类型RDD有分区器。
RDD文件读取与保存:可从文件格式(text、csv、sequence、object文件)和文件系统(本地、HDFS、HBASE、数据库)两个维度区分,不同文件格式有相应读取和保存方法。