Bootstrap

什么是 RDD?

RDD(Resilient Distributed Dataset) 是 Spark 对数据的抽象,可以理解为一种“分布式的数据集合”。它的核心思想是:

  • 弹性(Resilient):数据丢失后能自动恢复。

  • 分布式(Distributed):数据分散在集群的多台机器上。

  • 数据集(Dataset):可以是数字、文本、对象等任何数据形式。

类比理解:
把 RDD 想象成一堆积木,分散在多个工人(集群节点)手中。每个工人处理自己手里的积木,但如果某个工人突然离开(节点故障),系统能快速用其他积木重新拼出他原本的部分。

RDD 的 5 大特性

  1. 分区(Partitions)

    • 数据被切分成多个小块(分区),每个分区在集群不同节点上处理。

    • 例如:1GB 数据分成 100 个分区,每个分区 10MB。

  2. 不可变性(Immutable)

    • RDD 一旦创建就不能修改,只能通过转换操作生成新的 RDD。

    • 类似“版本控制”:每次操作记录差异,而不是直接修改原数据。

  3. 血统(Lineage)

    • RDD 记录自己是如何通过一步步操作(如 mapfilter)生成的。

    • 如果数据丢失,Spark 能根据血统重新计算恢复数据。

  4. 持久化(Persistence)

    • 可将频繁使用的 RDD 缓存到内存或磁盘,避免重复计算。

    • 例如:rdd.persist() 将数据留在内存中加速后续操作。

  5. 并行操作(Parallel Operations)

    • RDD 支持 mapfilterreduce 等并行操作,任务自动分发到不同节点执行。

RDD 的工作原理

  1. 创建 RDD

    • 从外部数据(如文件、数据库)加载,或由现有 RDD 转换而来。

    # 例子:从文本文件创建 RDD
    rdd = sc.textFile("hdfs://data.txt")
  2. 转换操作(Transformations)

    • 定义如何生成新 RDD,但不会立即执行(惰性计算)。

    # 例子:过滤出包含 "error" 的行
    error_rdd = rdd.filter(lambda line: "error" in line)
  3. 行动操作(Actions)

    • 触发实际计算,返回结果或保存数据。

    # 例子:统计行数(触发计算)
    print(error_rdd.count())

RDD 的容错机制

  • 血统(Lineage):记录 RDD 的生成过程,数据丢失时重新计算。

  • 检查点(Checkpoint):将关键 RDD 持久化到可靠存储(如 HDFS),避免长血统链的重新计算开销。

RDD 的适用场景

  1. 复杂数据流水线:需要多次转换和迭代计算的场景(如机器学习)。

  2. 细粒度控制:需手动优化数据分区、缓存策略时。

  3. 非结构化数据:处理文本、日志等非表格数据。

RDD 的局限与替代方案

  • 性能限制:RDD 的序列化和反序列化开销较大。

  • 更高级 API

    • DataFrame/Dataset:结构化数据,支持 SQL 查询和优化引擎(Spark SQL)。

    • Streaming:实时数据流处理(Spark Structured Streaming)。

;