Spark - RDD

弹性分布式数据集

弹性分布式数据集(RDD)是Spark的基本数据结构.它是一个不可变的分布式对象集合. RDD中的每个数据集被划分为逻辑分区,其可以在集群的不同节点上计算. RDD可以包含任何类型的Python,Java或Scala对象,包括用户定义的类.

正式地,RDD是一个只读的分区记录集合.可以通过对稳定存储或其他RDD上的数据的确定性操作来创建RDD. RDD是一个容错的容错集合,可以并行操作.

有两种方法可以创建RDD和minus; 并行化驱动程序中的现有集合,或引用外部存储系统中的数据集,例如共享文件系统,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上进行交互式查询时当前框架的工作原理./p> MapReduce上的交互操作

使用Spark RDD进行数据共享

由于复制序列化磁盘IO ,MapReduce中的数据共享速度很慢.大多数Hadoop应用程序,他们花费90%以上的时间进行HDFS读写操作.

认识到这个问题,研究人员开发了一个名为Apache Spark的专用框架.火花的关键思想是 R esbient D 归因 D atasets(RDD);它支持内存处理计算.这意味着,它将内存状态存储为作业中的对象,并且对象可在这些作业之间共享.内存中的数据共享速度比网络和磁盘快10到100倍.

现在让我们试着找出Spark RDD中迭代和交互操作的发生方式.

Spark RDD上的迭代操作

下面给出的插图显示了Spark RDD上的迭代操作.它将中间结果存储在分布式存储器中,而不是稳定存储(磁盘),并使系统更快.

注意 : 如果分布式内存(RAM)不足以存储中间结果(JOB的状态),那么它会将这些结果存储在磁盘上

Spark RDD上的迭代操作

Spark RDD上的交互操作

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

Spark RDD上的交互操作

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