- Apache Spark 教程
- Apache Spark - 首页
- Apache Spark - 简介
- Apache Spark - RDD
- Apache Spark - 安装
- Apache Spark - 核心编程
- Apache Spark - 部署
- 高级 Spark 编程
- Apache Spark 有用资源
- Apache Spark - 快速指南
- Apache Spark - 有用资源
- Apache Spark - 讨论
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)。虽然此框架提供了许多用于访问集群计算资源的抽象,但用户仍然想要更多。
**迭代**和**交互式**应用程序都需要在并行作业之间进行更快的数据共享。由于**复制、序列化**和**磁盘 I/O**,MapReduce 中的数据共享速度很慢。关于存储系统,大多数 Hadoop 应用程序花费超过 90% 的时间进行 HDFS 读写操作。
MapReduce 上的迭代操作
在多阶段应用程序中跨多个计算重用中间结果。下图说明了当前框架在 MapReduce 上执行迭代操作时的工作方式。由于数据复制、磁盘 I/O 和序列化,这会产生大量的开销,从而使系统变慢。
MapReduce 上的交互式操作
用户对同一数据集的子集运行临时查询。每个查询都会对稳定存储执行磁盘 I/O,这可能会占据应用程序执行时间的很大一部分。
下图说明了当前框架在 MapReduce 上执行交互式查询时的工作方式。
使用 Spark RDD 进行数据共享
由于**复制、序列化**和**磁盘 I/O**,MapReduce 中的数据共享速度很慢。大多数 Hadoop 应用程序花费超过 90% 的时间进行 HDFS 读写操作。
认识到这个问题,研究人员开发了一个专门的框架,称为 Apache Spark。Spark 的核心思想是**弹性分布式数据集 (RDD)**;它支持内存中处理计算。这意味着,它将内存状态作为作业间的一个对象存储,并且该对象可以在这些作业之间共享。内存中的数据共享速度比网络和磁盘快 10 到 100 倍。
现在让我们尝试找出 Spark RDD 中迭代和交互式操作是如何进行的。
Spark RDD 上的迭代操作
下图显示了 Spark RDD 上的迭代操作。它将中间结果存储在分布式内存中,而不是稳定存储(磁盘),从而使系统更快。
**注意** - 如果分布式内存 (RAM) 不足以存储中间结果(作业状态),则会将这些结果存储在磁盘上。
Spark RDD 上的交互式操作
此图显示了 Spark RDD 上的交互式操作。如果对同一组数据重复运行不同的查询,则可以将此特定数据保存在内存中以获得更好的执行时间。
默认情况下,每次在转换后的 RDD 上运行操作时,可能会重新计算每个转换后的 RDD。但是,您也可以将 RDD **持久化**到内存中,在这种情况下,Spark 会将元素保留在集群中,以便下次查询时可以更快地访问。还支持将 RDD 持久化到磁盘上或复制到多个节点上。