运行架构:
Spark采用master - slave结构,Driver作为master负责作业任务调度,Executor作为slave负责实际执行任务。
核心组件
- Driver:执行Spark任务的main方法,将用户程序转化为作业,在Executor间调度任务,跟踪Executor执行情况并通过UI展示运行情况。
- -Executor:工作节点中的JVM进程,运行任务并返回结果,还为缓存的RDD提供内存式存储。
- Master & Worker:在独立部署环境中,Master负责资源调度分配和集群监控,Worker在Master分配资源后进行数据并行处理。
- -ApplicationMaster:在YARN环境中,负责申请资源容器、运行任务、监控任务状态和处理异常。
核心概念
- Executor与Core:Executor是计算节点,可通过参数指定其数量、内存大小和虚拟CPU核数量。
- 并行度:指集群并行执行任务的数量,默认由框架配置,也可在应用运行时动态修改。
- 有向无环图(DAG):是Spark程序数据流的高级抽象模型,用图形表示程序计算执行过程,用于展示程序拓扑结构。
提交流程
以Yarn环境为例,Spark应用程序有Client和Cluster两种部署执行方式。
- Yarn Client模式:Driver在本地机器运行,与ResourceManager通讯申请启动ApplicationMaster,后续完成Executor启动、反向注册等流程后执行main函数,遇到Action算子时划分stage并分发task。
- Yarn Cluster模式:Driver在Yarn集群资源中执行,任务提交后申请启动ApplicationMaster(此时ApplicationMaster就是Driver),后续流程与Client模式类似 。
RDD相关概念
RDD概述:
RDD是Spark最基本的数据处理模型,是一个抽象类,代表弹性、不可变、可分区且元素可并行计算的集合。具有存储、容错、计算、分片弹性,数据分布式存储,封装计算逻辑但不保存数据。
核心属性:
包含分区列表、分区计算函数、RDD之间的依赖关系、分区器(K-V类型数据时可选)、首选位置(可选),这些属性是RDD实现分布式计算和高效处理的关键。
执行原理:
在Yarn环境中,Spark先申请资源创建调度和计算节点,将计算逻辑按分区划分为任务,调度节点根据计算节点状态发送任务执行,RDD负责封装逻辑并生成任务。
RDD序列化:
涉及闭包检查,确保算子外数据可序列化;Spark支持Kryo序列化框架,比Java序列化速度快10倍,使用时即使采用Kryo序列化,相关类也需继承Serializable接口。
RDD依赖关系
血缘关系:
记录RDD元数据和转换行为,用于恢复丢失分区数据。
依赖类型:
窄依赖指父RDD分区最多被一个子RDD分区使用;
宽依赖指父RDD分区被多个子RDD分区依赖,会引发Shuffle。
阶段与任务划分:
DAG记录RDD转换和任务阶段;一个Action算子生成一个Job,Stage数量为宽依赖个数加1,一个Stage中最后一个RDD的分区数就是Task个数。
RDD持久化
Cache缓存:
通过Cache或Persist方法缓存计算结果,默认存于JVM堆内存,触发action算子时缓存,缓存丢失可重算丢失部分。
CheckPoint检查点:
将RDD中间结果写入磁盘,切断血缘依赖,提升容错性,执行Action操作才会触发。
区别:
Cache不切断血缘,数据可靠性低;Checkpoint切断血缘,数据存储在高可靠文件系统。建议对Checkpoint的RDD使用Cache缓存以提升效率。
RDD分区器:
Spark支持Hash分区(默认)、Range分区和用户自定义分区,仅Key - Value类型RDD有分区器。
Hash分区根据key的hashCode取余确定分区;Range分区将数据按范围映射到分区,保证数据均匀且分区间有序。
RDD文件读取与保存:
可从文件格式(text、csv、sequence、object文件)和文件系统(本地、HDFS、HBASE、数据库)两个维度区分。不同文件格式有相应读取和保存方法,如text文件用 sc.textFile 读取、 saveAsTextFile 保存。