Apache 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)。尽管该框架提供了许多用于访问集群计算资源的抽象,但用户仍然需要更多。

迭代交互式应用程序都需要在并行作业之间更快地共享数据。由于复制、序列化磁盘 IO ,MapReduce 中的数据共享速度很慢。在存储系统方面,大部分Hadoop应用,90%以上的时间都在做HDFS的读写操作。

MapReduce 上的迭代操作

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

MapReduce 上的迭代操作

MapReduce 上的交互操作

用户对同一数据子集运行即席查询。每个查询都会在稳定存储上执行磁盘 I/O,这可以控制应用程序的执行时间。

下图解释了当前框架在 MapReduce 上进行交互式查询时如何工作。

MapReduce 上的交互操作

使用 Spark RDD 进行数据共享

由于复制、序列化磁盘 IO ,MapReduce 中的数据共享速度很慢。大多数Hadoop应用程序,他们90%以上的时间都在做HDFS读写操作。

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

现在让我们尝试了解一下 Spark RDD 中是如何进行迭代和交互操作的。

Spark RDD 上的迭代操作

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

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

Spark RDD 上的迭代操作

Spark RDD的交互操作

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

Spark RDD的交互操作

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