📅  最后修改于: 2020-12-02 05:50:04             🧑  作者: Mango
弹性分布式数据集(RDD)是Spark的基本数据结构。它是对象的不可变分布式集合。 RDD中的每个数据集都分为逻辑分区,可以在群集的不同节点上进行计算。 RDD可以包含任何类型的Python,Java或Scala对象,包括用户定义的类。
正式而言,RDD是记录的只读分区集合。可以通过对稳定存储上的数据或其他RDD进行确定性操作来创建RDD。 RDD是可以并行操作的元素的容错集合。
有两种创建RDD的方法-并行化驱动程序中的现有集合,或引用外部存储系统(例如共享文件系统,HDFS,HBase或提供Hadoop输入格式的任何数据源)中的数据集。
Spark利用RDD的概念来实现更快,更有效的MapReduce操作。让我们首先讨论MapReduce操作是如何发生的以及为什么它们效率不高。
MapReduce被广泛采用,用于在集群上使用并行分布式算法处理和生成大型数据集。它允许用户使用一组高级运算符来编写并行计算,而不必担心工作分配和容错性。
不幸的是,在大多数当前框架中,在计算之间(两个MapReduce作业之间的Ex-)重用数据的唯一方法是将其写入外部稳定的存储系统(Ex-HDFS)。尽管此框架提供了许多用于访问群集的计算资源的抽象,但用户仍然需要更多。
迭代和交互式应用程序都需要跨并行作业更快地共享数据。由于复制,序列化和磁盘IO ,MapReduce中的数据共享速度很慢。对于存储系统,大多数Hadoop应用程序花费90%以上的时间进行HDFS读写操作。
在多阶段应用程序中跨多个计算重用中间结果。下图说明了在MapReduce上进行迭代操作时当前框架的工作方式。由于数据复制,磁盘I / O和序列化,这会导致相当大的开销,这会使系统变慢。
用户对同一数据子集运行临时查询。每个查询都会在稳定存储上执行磁盘I / O,这可能会影响应用程序的执行时间。
下图说明了在MapReduce上进行交互式查询时当前框架的工作方式。
由于复制,序列化和磁盘IO ,MapReduce中的数据共享速度很慢。在大多数Hadoop应用程序中,它们花费90%以上的时间进行HDFS读写操作。
认识到此问题后,研究人员开发了一种名为Apache Spark的专用框架。火花的关键思想为R esilient d istributed d atasets(RDD);它支持内存处理计算。这意味着,它将内存状态存储为跨作业的对象,并且该对象可在这些作业之间共享。内存中的数据共享比网络和磁盘快10到100倍。
现在让我们尝试找出在Spark RDD中如何进行迭代和交互操作。
下图显示了Spark RDD上的迭代操作。它将中间结果存储在分布式内存中,而不是稳定存储(磁盘)中,并使系统运行更快。
注–如果分布式内存(RAM)不足以存储中间结果(JOB的状态),则它将这些结果存储在磁盘上。
此图显示了在Spark RDD上的交互操作。如果对同一组数据重复执行不同的查询,则可以将这些特定数据保留在内存中,以缩短执行时间。
默认情况下,每次在其上执行操作时,都可能会重新计算每个转换后的RDD。但是,您也可以将RDD保留在内存中,在这种情况下,Spark将在下次查询时将元素保留在群集中,以加快访问速度。还支持将RDD持久保存在磁盘上,或在多个节点之间复制。