- Spark SQL 教程
- Spark SQL - 首页
- Spark - 简介
- Spark - RDD
- Spark - 安装
- Spark SQL - 简介
- Spark SQL - 数据框
- Spark SQL - 数据源
- Spark SQL 有用资源
- Spark SQL - 快速指南
- Spark SQL - 有用资源
- Spark SQL - 讨论
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 上的交互操作
用户对同一数据集的子集运行 ad-hoc 查询。每个查询都将在稳定存储上执行磁盘 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 **持久化**到内存中,在这种情况下,Spark 将在下次查询它时将元素保留在集群中以实现更快的访问。还支持将 RDD 持久化到磁盘或跨多个节点复制。