Resilient Distributed Datasets (RDD)
Resilient Distributed Datasets
RDD本质上是一组数据的Spark表示,分布在多台机器上,使用API让您对其进行操作。RDD可以来自任何数据源,例如文本文件,通过JDBC的数据库等。
其定义为:
RDD是容错的并行数据结构,允许用户明确地将中间结果保存在内存中,控制其分区以优化数据放置,并使用各种的运算符操作。
弹性分布式数据集(RDD)是Spark的基本数据结构。它是一个不可变的分布式对象集合。RDD中的每个数据集被划分为逻辑分区,其可以在集群的不同节点上计算。RDD可以包含任何类型的Python,Java或Scala对象,包括用户定义的类。
形式上,RDD是只读的分区记录集合。可以通过对稳定存储或其他RDD上的数据的确定性操作来创建RDD。RDD是一个容错的容错集合,可以并行操作。
有两种方法可以创建RDD - 在驱动程序中并行化现有集合,或在外部存储系统中引用数据集,例如共享文件系统,HDFS,HBase或提供Hadoop输入格式的任何数据源。
Spark利用RDD的概念来实现更快,更高效的MapReduce操作。让我们首先讨论MapReduce操作是如何发生的以及为什么它们不那么有效。
MapReduce中的数据共享速度很慢
MapReduce被广泛用于在集群上使用并行分布式算法处理和生成大型数据集。它允许用户使用一组高级操作符编写并行计算,而不必担心工作分配和容错。
不幸的是,在大多数当前框架中,在计算之间重用数据的唯一方法(Ex − between two MapReduce jobs)是将其写入外部稳定存储系统(Ex-HDFS)。虽然这个框架提供了许多用于访问集群计算资源的抽象,但用户仍然需要更多。
迭代和交互应用程序都要求跨并行作业更快地共享数据。由于复制、序列化和磁盘IO, MapReduce中的数据共享很慢。对于存储系统,大多数Hadoop应用程序花费90%以上的时间进行HDFS读写操作。
MapReduce上的迭代操作
在多阶段应用程序中跨多个计算重用中间结果。下面的插图解释了当前框架如何工作,同时在MapReduce上执行迭代操作。由于数据复制、磁盘I/O和序列化导致系统运行缓慢,这会导致大量开销。
MapReduce上的交互操作
用户在同一数据子集上运行特殊查询。每个查询将在稳定的存储上执行磁盘I/O,这将支配应用程序的执行时间。
下图解释了当前框架在MapReduce上执行交互查询时是如何工作的。
利用RDD做数据共享
由于复制、序列化和磁盘IO, MapReduce中的数据共享很慢。大多数Hadoop应用程序花费90%以上的时间执行HDFS读写操作。
认识到这个问题后,研究人员开发了一个名为Apache Spark的专门框架。spark的核心思想是弹性分布式数据集(RDD);它支持内存处理计算。这意味着,它将内存状态作为一个对象跨作业存储,并且该对象可以在这些作业之间共享。内存中的数据共享速度比网络和磁盘快10到100倍。
在RDD中上的迭代操作
下图显示了Spark RDD上的迭代操作。它将中间结果存储在分布式内存中,而不是稳定的存储(磁盘)中,使系统速度更快。
注意:如果分布式内存(RAM)不足以存储中间结果(作业状态),那么它将把这些结果存储在磁盘上。
基于RDD中的交互操作
这个图显示了Spark RDD上的交互操作。如果在同一组数据上重复运行不同的查询,则可以将此特定数据保存在内存中,以获得更好的执行时间。
默认情况下,每次对每个转换后的RDD运行操作时,都可以重新计算它。不过,您也可以在内存中保存一个RDD,在这种情况下,Spark将把元素保存在集群中,以便在下次查询时更快地访问它。还支持在磁盘上持久存储RDDs,或跨多个节点复制RDDs。