Spark RDD

2018-12-20 10:08 更新

弹性分布式数据集

弹性分布式数据集(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)不足以存储中间结果(JOB的状态),则它将这些结果存储在磁盘上

在星火RDD迭代操作

在星火RDD交互式操作

此图显示星火RDD交互式操作。如果不同的查询在同一组数据的反复运行,该特定数据可被保存在内存中获得更好的执行时间。

在星火RDD交互式操作

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

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号