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作业之间)是将其写入外部稳定存储系统(Ex- 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的关键思想是 - [R esilient d istributed d atasets(RDD); 它支持内存中的处理计算。这意味着,它将内存状态作为对象存储在作业中,并且对象可在这些作业之间共享。内存中的数据共享速度比网络和磁盘快10到100倍。

现在让我们试着找出Spark RDD中如何进行迭代和交互操作。

Spark RDD上的迭代操作

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

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

Spark RDD上的迭代操作

Spark RDD上的交互式操作

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

Spark RDD上的交互式操作

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