Spark RDD五大核心特性
Spark RDD (Resilient Distributed Dataset,弹性分布式数据集) 是 Spark 中最基本的数据抽象。它代表一个不可变、可分区、里面的元素可并行计算的集合。
理解 RDD 的特性是掌握 Spark 核心原理的关键。以下是 RDD 的 5 大核心特性 及其详细解读:
1. 分布式 (Distributed)
- 含义:RDD 中的数据逻辑上是一个整体,但物理上存储在集群的不同节点上。
- 作用:使得 Spark 能够利用集群的多台机器进行并行计算。
- 分区 (Partitions):RDD 被划分为多个逻辑分区(Partition)。每个分区是计算的最小单位,一个 Task 处理一个分区。分区的数量决定了并行度。
2. 容错性 / 弹性 (Resilient)
- 含义:当部分节点或分区数据丢失时,Spark 能够自动恢复数据,而无需从头开始重新计算整个任务。
-
实现机制:血缘关系 (Lineage)
- RDD 不直接存储数据本身(除非缓存),而是记录产生该 RDD 的转换逻辑(即它是由哪个父 RDD 经过什么操作得到的)。
- 这种依赖关系构成了 DAG (有向无环图)。
- 恢复过程:如果某个分区丢失,Spark 会根据血缘关系,找到父 RDD,重新执行相应的转换操作来恢复丢失的分区。
- 检查点 (Checkpoint):对于血缘关系过长的 RDD,恢复代价太大。Spark 允许将 RDD 持久化到可靠存储(如 HDFS),切断血缘,这叫 Checkpoint。
3. 不可变性 (Immutable)
- 含义:RDD 一旦创建,其内容就不能被修改。
- 操作方式:如果对 RDD 进行“修改”(如 filter, map),实际上是基于原 RDD 生成了一个新的 RDD。原 RDD 保持不变。
-
优势:
- 简化了并发控制(无需锁)。
- 保证了血缘关系的清晰,有利于容错恢复。
- 便于推测执行(Speculative Execution)。
4. 惰性计算 (Lazy Evaluation)
- 含义:RDD 的转换操作(Transformation)不会立即执行,只有遇到行动操作(Action)时,整个计算流程才会真正触发。
-
分类:
-
Transformation (转换):如
map,filter,flatMap,join。这些操作只是记录了计算逻辑,构建 DAG。 -
Action (行动):如
count,collect,saveAsTextFile,reduce。这些操作会触发 Job 的提交和实际计算。
-
Transformation (转换):如
- 优势:Spark 可以在执行前对整个 DAG 进行全局优化(例如管道优化、合并操作),从而提高执行效率。
5. 位置偏好 (Location Preference)
- 含义:Spark 调度器在分配任务时,会尽量将计算任务分配到存储该数据分区的节点上。
- 原则:移动计算比移动数据更便宜 (Move Computation to Data)。
- 优势:极大减少了网络传输开销,提高了计算性能。
补充特性:持久化 (Persistence / Caching)
虽然上述 5 点是 RDD 的本质属性,但持久化是 RDD 使用中非常重要的特性。
-
机制:用户可以通过
cache()或persist()将 RDD 缓存在内存或磁盘中。 - 目的:如果一个 RDD 在多个行动操作中被重复使用,缓存可以避免重复计算,显著提升性能。
-
存储级别:支持多种级别,如
MEMORY_ONLY,MEMORY_AND_DISK,DISK_ONLY等。
RDD 的创建方式
-
并行化集合:通过
sc.parallelize()将 Driver 端的集合分布式化。 -
外部数据集:通过
sc.textFile()等读取 HDFS、S3、本地文件系统等。 - 从其他 RDD 转换:通过 Transformation 算子从已有的 RDD 生成新的 RDD。
RDD vs DataFrame/Dataset (简要对比)
虽然 RDD 是基础,但在现代 Spark 开发中,DataFrame/Dataset 更常用。
|
特性 |
RDD |
DataFrame / Dataset |
|---|---|---|
|
抽象级别 |
低级抽象 (JVM 对象) |
高级抽象 (类似数据库表) |
|
优化 |
无 Catalyst 优化器 |
有 Catalyst 优化器 (执行计划优化) |
|
类型安全 |
编译时类型安全 |
Dataset 有,DataFrame 无 (运行时) |
|
适用场景 |
复杂的底层控制、非结构化数据 |
SQL 查询、结构化/半结构化数据 |
|
性能 |
相对较低 (序列化开销大) |
相对较高 ( Tungsten 引擎优化) |
总结
RDD 的核心可以概括为:“一个分区的、不可变的、有血缘记录的、惰性计算的分布式数据集合”。
- 分区 决定了并行度。
- 不可变 保证了线程安全和血缘清晰。
- 血缘 保证了容错能力。
- 惰性 提供了全局优化的空间。
- 位置偏好 保证了计算效率。
© 版权声明
文章版权归作者所有,未经允许请勿转载。