弹性分布式数据集(RDD):Spark核心数据处理模型,具备弹性、不可变、可分区、并行计算特性。
弹性:存储(内存/磁盘切换)、容错(自动恢复)、计算(重试机制)、分片(动态调整)。
分区列表:实现分布式并行计算。
分区函数:每个分区的计算逻辑。
依赖关系:父子RDD间的依赖(窄依赖、宽依赖)。
分区器(可选):决定数据分布(Hash分区、Range分区)。
首选位置(可选):优化计算节点选择。
执行原理
Spark在Yarn环境中通过资源申请、任务分解、调度执行完成计算,RDD封装逻辑并生成Task发送给Executor。
序列化
闭包检查:确保算子外数据可序列化传输到Executor。
Kryo框架:高效序列化,性能优于Java序列化。
依赖关系
血缘关系(Lineage):记录RDD转换历史,用于容错恢复。
窄依赖:父分区仅被子分区一对一依赖(如map)。
宽依赖:父分区被子分区多对多依赖(如reduceByKey),触发Shuffle。
阶段划分:基于宽依赖将任务划分为Stage,形成DAG。
持久化
缓存(Cache/Persist):数据暂存内存/磁盘,血缘保留,可重复使用。
检查点(Checkpoint):数据持久化到HDFS,切断血缘,高可靠。
文件读写
支持text、sequence、object等格式,可对接本地文件系统、HDFS、HBase等。
WordCount示例
-
Maven项目配置:添加spark-core依赖,配置Scala编译插件。
-
代码实现:
读取文件→分词→映射为键值对→聚合统计→输出结果。
-
日志配置:通过log4j.properties减少日志输出干扰。
-
常见问题:Windows环境下需配置HADOOP_HOME解决Hadoop依赖问题。
RDD创建方式
-
内存集合:parallelize或makeRDD(底层相同)。
-
外部文件:textFile读取本地或HDFS文件。
-
其他RDD转换:通过算子生成新RDD。
-
直接创建:框架内部使用。
并行度与分区
并行度:由分区数决定,可通过参数指定(如makeRDD(list, numPartitions))。
分区规则:
内存数据:按元素数均匀分配。
文件数据:遵循Hadoop切片规则(如textFile的第二个参数)。
Spark运行架构
核心组件
Driver:执行main方法,负责作业调度、任务分发、状态跟踪。
Executor:Worker节点的JVM进程,运行Task并缓存RDD数据。
Master/Worker:独立部署时,Master管理资源,Worker执行任务。
ApplicationMaster:Yarn中协调资源申请与任务调度。
核心概念
并行度:同时执行的任务数,影响计算效率。
DAG(有向无环图):表示任务执行流程,按宽依赖划分Stage。
提交流程(Yarn模式)
Client模式:
Driver在本地运行,适合测试。
流程:Driver→申请资源→启动ApplicationMaster→启动Executor→执行任务。
Cluster模式:
Driver在集群中运行,适合生产。
流程:ApplicationMaster(即Driver)直接管理资源与任务。
执行流程
-
Action触发Job,按宽依赖划分Stage。
-
生成TaskSet,分发到Executor并行执行。