spark核心数据结构:RDD 深度解析与原理剖析
RDD(Resilient Distributed Dataset,弹性分布式数据集)是 Spark 最核心的抽象,贯穿了 Spark 分布式计算的整个生命周期。它不仅是数据的载体,更是 Spark 实现高效并行计算、容错机制和灵活编程模型的基础。本文基于 Spark 源码注释,详细讲解 RDD 的五大核心属性、特性及底层实现原理,帮助开发者从根本上理解 Spark 数据处理的逻辑。
RDD 核心定义与本质
RDD 是 Spark 对分布式数据的抽象,可理解为一个不可变、可分区、可并行计算且具备容错机制的分布式元素集合。其核心定义在 Spark 源码中通过五大属性描述,这些属性决定了 RDD 的行为和功能:
1 | /* Internally, each RDD is characterized by five main properties: |
RDD 五大核心属性详解
分区列表(Partitions):并行计算的基础
定义
protected def getPartitions: Array[Partition]
RDD 由多个分区(Partition)组成,每个分区是 RDD 数据的一个子集,分布在集群的不同节点上。分区是 Spark 并行计算的最小单位,一个分区对应一个 Task 任务。
核心作用
- 并行计算:多个分区可被分配到不同 Executor 并行处理,充分利用集群算力;
- 数据本地化:分区数据存储在集群节点上,任务调度时优先在数据所在节点执行,减少网络传输;
- 规模扩展:通过调整分区数量,适配不同数据量(如 1TB 数据可分为 1000 个分区,每个分区约 1GB)。
示例
- 读取 HDFS 文件创建的 RDD,分区数默认与 HDFS 块数一致(默认 128MB / 块);
- 通过
rdd.getNumPartitions可获取分区数,通过repartition(num)可调整分区数。
分区计算函数(Compute):数据处理的逻辑
定义
def compute(split: Partition, context: TaskContext): Iterator[T]
该函数定义了如何计算 RDD 中单个分区的数据,是 RDD 转换和行动操作的核心执行逻辑。
核心作用
- 惰性计算:compute 函数仅在 Action 操作触发时才会执行,避免不必要的中间计算;
- 分区独立计算:每个分区的计算逻辑独立,无需依赖其他分区的数据(除非有 Shuffle 依赖);
- 迭代器优化:返回值为 Iterator(迭代器),支持流式处理,减少内存占用(无需一次性加载整个分区数据)。
示例
map操作的 compute 函数:对分区迭代器中的每个元素应用映射逻辑;filter操作的 compute 函数:对分区迭代器中的元素进行过滤,保留符合条件的元素。
