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上的交互操作
用户对同一数据子集运行临时查询。每个查询将执行稳定存储上的磁盘I / O,这可以控制应用程序的执行时间。
下图说明了在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上的交互操作。如果重复对同一组数据运行不同的查询,则可以将这些特定的数据保存在内存中以获得更好的执行时间。
默认情况下,每次对其执行操作时,每个转换后的RDD都可能会重新计算。但是,您也可以将RDD 保留 在内存中,在这种情况下,Spark会保留群集中的元素,以便在下次查询时快速访问。还支持在磁盘上保存RDD,或在多个节点上复制RDD。