RDD(Resilient Distributed Dataset) 是 Spark 对数据的抽象,可以理解为一种“分布式的数据集合”。它的核心思想是:
-
弹性(Resilient):数据丢失后能自动恢复。
-
分布式(Distributed):数据分散在集群的多台机器上。
-
数据集(Dataset):可以是数字、文本、对象等任何数据形式。
类比理解:
把 RDD 想象成一堆积木,分散在多个工人(集群节点)手中。每个工人处理自己手里的积木,但如果某个工人突然离开(节点故障),系统能快速用其他积木重新拼出他原本的部分。
RDD 的 5 大特性
-
分区(Partitions)
-
数据被切分成多个小块(分区),每个分区在集群不同节点上处理。
-
例如:1GB 数据分成 100 个分区,每个分区 10MB。
-
-
不可变性(Immutable)
-
RDD 一旦创建就不能修改,只能通过转换操作生成新的 RDD。
-
类似“版本控制”:每次操作记录差异,而不是直接修改原数据。
-
-
血统(Lineage)
-
RDD 记录自己是如何通过一步步操作(如
map
、filter
)生成的。 -
如果数据丢失,Spark 能根据血统重新计算恢复数据。
-
-
持久化(Persistence)
-
可将频繁使用的 RDD 缓存到内存或磁盘,避免重复计算。
-
例如:
rdd.persist()
将数据留在内存中加速后续操作。
-
-
并行操作(Parallel Operations)
-
RDD 支持
map
、filter
、reduce
等并行操作,任务自动分发到不同节点执行。
-
RDD 的工作原理
-
创建 RDD
-
从外部数据(如文件、数据库)加载,或由现有 RDD 转换而来。
# 例子:从文本文件创建 RDD rdd = sc.textFile("hdfs://data.txt")
-
-
转换操作(Transformations)
-
定义如何生成新 RDD,但不会立即执行(惰性计算)。
# 例子:过滤出包含 "error" 的行 error_rdd = rdd.filter(lambda line: "error" in line)
-
-
行动操作(Actions)
-
触发实际计算,返回结果或保存数据。
# 例子:统计行数(触发计算) print(error_rdd.count())
-
RDD 的容错机制
-
血统(Lineage):记录 RDD 的生成过程,数据丢失时重新计算。
-
检查点(Checkpoint):将关键 RDD 持久化到可靠存储(如 HDFS),避免长血统链的重新计算开销。
RDD 的适用场景
-
复杂数据流水线:需要多次转换和迭代计算的场景(如机器学习)。
-
细粒度控制:需手动优化数据分区、缓存策略时。
-
非结构化数据:处理文本、日志等非表格数据。
RDD 的局限与替代方案
-
性能限制:RDD 的序列化和反序列化开销较大。
-
更高级 API:
-
DataFrame/Dataset:结构化数据,支持 SQL 查询和优化引擎(Spark SQL)。
-
Streaming:实时数据流处理(Spark Structured Streaming)。
-