Spark技术系列(二):深入理解RDD编程模型——从原理到生产实践
1. RDD设计哲学与核心定位
1.1 为什么需要RDD?
- MapReduce的缺陷:固定Map/Reduce阶段、中间数据频繁落盘、难以处理迭代计算
- RDD(Resilient Distributed Datasets)核心价值:
- 内存计算:中间结果缓存至内存,减少磁盘IO
- 弹性容错:通过血统(Lineage)重建丢失分区
- 并行处理:自动划分数据分片,分布式执行计算
1.2 核心设计原则
abstract class RDD[T](
@transient private var _sc: SparkContext,
@transient private var deps: Seq[Dependency[_]]
) extends Serializable with Logging {
def compute(split: Partition, context: TaskContext): Iterator[T]
protected def getPartitions: Array[Partition]
protected def getDependencies: Seq[Dependency[_]] = deps
}
- 不可变性(Immutable):每次转换生成新RDD,保障血统清晰
- 延迟执行(Lazy Evaluation):行动操作触发DAG构建与任务执行
- 分区感知(Partitioning):数据物理分布与计算并行度强关联
2. RDD五大核心特性深度解析
2.1 分区列表(Partitions)
2.2 计算函数(Compute Function)
2.3 依赖关系(Dependencies)
窄依赖 vs 宽依赖