Spark – RDD



弹性分布式数据集

弹性分布式数据集 (RDD) 是 Spark 的基本数据结构。它是一个不可变的分布式对象集合。RDD 中的每个数据集都分成逻辑分区,这些分区可以在集群的不同节点上计算。RDD 可以包含任何类型的 Python、Java 或 Scala 对象,包括用户定义的类。

正式地说,RDD 是一个只读的、分区的记录集合。RDD 可以通过对稳定存储上的数据或其他 RDD 执行确定性操作来创建。RDD 是一个容错的元素集合,可以并行操作。

创建 RDD 有两种方法:**并行化**驱动程序程序中现有的集合,或**引用**外部存储系统(如共享文件系统、HDFS、HBase 或任何提供 Hadoop 输入格式的数据源)中的数据集。

Spark 利用 RDD 的概念来实现更快、更高效的 MapReduce 操作。让我们首先讨论 MapReduce 操作是如何发生的以及为什么它们效率不高。

MapReduce 中的数据共享速度慢

MapReduce 被广泛用于使用集群上的并行分布式算法处理和生成大型数据集。它允许用户使用一组高级运算符编写并行计算,而无需担心工作分配和容错。

不幸的是,在大多数当前框架中,在计算之间(例如,在两个 MapReduce 作业之间)重用数据的唯一方法是将其写入外部稳定存储系统(例如,HDFS)。尽管此框架提供了许多用于访问集群计算资源的抽象,但用户仍然希望获得更多。

**迭代**和**交互**应用程序都需要在并行作业之间进行更快的共享数据。由于**复制**、**序列化**和**磁盘 I/O**,MapReduce 中的数据共享速度很慢。关于存储系统,大多数 Hadoop 应用程序花费超过 90% 的时间执行 HDFS 读写操作。

MapReduce 上的迭代操作

在多阶段应用程序中的多个计算中重用中间结果。下图说明了当前框架在 MapReduce 上执行迭代操作时的工作原理。由于数据复制、磁盘 I/O 和序列化,这会导致大量开销,从而使系统变慢。

Iterative Operations on MapReduce

MapReduce 上的交互操作

用户对同一数据集的子集运行 ad-hoc 查询。每个查询都将在稳定存储上执行磁盘 I/O,这可能会主导应用程序执行时间。

下图说明了当前框架在 MapReduce 上执行交互式查询时的工作原理。

Interactive Operations on MapReduce

使用 Spark RDD 共享数据

由于**复制**、**序列化**和**磁盘 I/O**,MapReduce 中的数据共享速度很慢。大多数 Hadoop 应用程序花费超过 90% 的时间执行 HDFS 读写操作。

认识到这个问题,研究人员开发了一个名为 Apache Spark 的专门框架。Spark 的核心思想是**弹性分布式数据集**(RDD);它支持内存中处理计算。这意味着它将内存状态存储为跨作业的对象,并且该对象可以在这些作业之间共享。内存中的数据共享速度比网络和磁盘快 10 到 100 倍。

现在让我们尝试找出 Spark RDD 中迭代和交互操作是如何发生的。

Spark RDD 上的迭代操作

下图显示了 Spark RDD 上的迭代操作。它将中间结果存储在分布式内存中,而不是稳定存储(磁盘),从而使系统更快。

**注意** - 如果分布式内存(RAM)不足以存储中间结果(作业状态),则它将把这些结果存储在磁盘上。

Iterative Operations on Spark RDD

Spark RDD 上的交互操作

此图显示了 Spark RDD 上的交互操作。如果对同一组数据重复运行不同的查询,则可以将此特定数据保存在内存中以获得更好的执行时间。

Interactive Operations on Spark RDD

默认情况下,每次对转换后的 RDD 运行操作时,它都可能重新计算。但是,您也可以将 RDD **持久化**到内存中,在这种情况下,Spark 将在下次查询它时将元素保留在集群中以实现更快的访问。还支持将 RDD 持久化到磁盘或跨多个节点复制。

广告

© . All rights reserved.