基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Spark中的RDD(弹性分布式数据集)是什么?

知识点图片

RDD 全称为 Resilient Distributed Dataset(弹性分布式数据集),它是 Apache Spark 中最基本的数据抽象。

简单来说,RDD 是一个不可变的可分区的、里面的元素可被并行操作的集合。

为了让你更透彻地理解,我们可以把 RDD 这个名字拆解开来看:

1. 核心概念拆解

  • Resilient(弹性/容错性):
    • 这是 RDD 最核心的特性。如果 Spark 集群中的某个节点挂掉了,或者某个分区的数据丢失了,RDD 可以自动恢复。
    • 原理: RDD 并不直接存储硬盘上的物理数据,而是记录了“如何产生这些数据”的步骤(这被称为 Lineage/血统)。如果数据丢了,Spark 只需要根据血统记录,重新计算丢失的那一部分数据即可,而不需要从头重算整个任务。
  • Distributed(分布式):
    • RDD 中的数据并不是存储在一台机器的内存中,而是被切分成多个 Partition(分区),散落在集群的多台机器上。
    • 这使得 Spark 能够让多台机器同时处理同一个 RDD 的不同部分(并行计算)。
  • Dataset(数据集):
    • 它就是一个数据的集合。这些数据可以是简单的字符串、整数,也可以是复杂的对象(如 Java/Scala 对象)。

2. RDD 的五大主要特性

  1. 分区列表 (List of Partitions): 数据被切分成了很多块(分区),这是并行计算的基础单位。
  2. 计算函数 (Compute Function): 每个分区都有一个函数来处理其中的数据。
  3. 依赖关系 (Dependencies): RDD 知道它是从哪个父 RDD 转换而来的(血统)。
  4. 分区器 (Partitioner - 可选): 对于键值对(Key-Value)类型的 RDD,可以指定分区策略(如 Hash 分区或 Range 分区)。
  5. 优先位置 (Preferred Locations - 可选): “移动计算比移动数据更便宜”。RDD 知道数据存储在哪台机器上,Spark 会尽量把计算任务分配到存储数据的机器上运行(数据本地性)。

3. RDD 的操作模式

RDD 的操作分为两大类,理解这个非常重要:

A. Transformation(转换算子)

  • 特点: 惰性求值 (Lazy Evaluation)
  • 含义: 这些操作不会立即执行,只是“记录”下要做什么。它们会生成一个新的 RDD。
  • 例子: map, filter, flatMap, groupByKey, reduceByKey
  • 比喻: 就像写菜谱,写下“切菜”、“炒菜”的步骤,但此时并没有真正开始做饭。

B. Action(行动算子)

  • 特点: 触发执行
  • 含义: 只有当 Action 被调用时,Spark 才会真正提交作业(Job),根据之前的 Transformation 链条开始计算,并产生结果(返回给 Driver 程序或写入外部存储)。
  • 例子: count, collect, saveAsTextFile, first, take
  • 比喻: 就像大喊一声“上菜!”,厨师才开始根据刚才写的菜谱真正动手做饭。

4. 为什么要用 RDD?(相比 Hadoop MapReduce)

  • 内存计算: MapReduce 通常将中间结果写入磁盘(HDFS),速度慢。RDD 将中间结果保存在内存中,这使得迭代计算(如机器学习算法)的速度比 MapReduce 快 10 到 100 倍。
  • 容错高效: 相比于通过数据复制(Replication)来容错,RDD 通过重新计算(Lineage)来容错,节省了大量的存储空间和网络传输开销。

5. RDD vs DataFrame/Dataset (现状)

虽然 RDD 是 Spark 的基石,但在现代 Spark 开发(Spark 2.0 以后)中:

  • RDD:低阶 API。它功能强大,让你能控制每一行代码的执行逻辑,但它没有优化引擎,且代码写起来比较繁琐。通常用于处理非结构化数据或需要极细粒度控制的场景。
  • DataFrame / Dataset:高阶 API。它们底层也是 RDD,但经过了 Spark SQL 引擎(Catalyst 优化器)的优化,通常比手写的 RDD 代码运行得更快,且语法更像 SQL,更易用。

总结: RDD 是 Spark 的灵魂,理解 RDD 有助于你理解 Spark 的底层运行机制(如分区、Shuffle、容错),但在实际业务开发中,优先推荐使用 DataFrame/Dataset。

00:00
00:00