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 上的交互式操作
用户对同一数据子集运行临时查询。每个查询都将在稳定存储上执行磁盘 I/O,这可能会占用应用程序执行时间。
下图说明了当前框架在 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 上的交互式操作。如果对同一组数据重复运行不同的查询,则可以将这些特定数据保存在内存中以获得更好的执行时间。
默认情况下,每次对每个转换后的 RDD 运行操作时,都可能会重新计算。但是,您也可以将 RDD 保留在内存中,在这种情况下,Spark 会将元素保留在集群中,以便下次查询时更快地访问。还支持将 RDD 保留在磁盘上,或跨多个节点复制。