Spark 中的RDD是什么东东?为什么需要它?

来源:互联网 发布:sql数据库基础知识pdf 编辑:程序博客网 时间:2024/05/17 05:00

原文链接:https://dzone.com/articles/what-is-rdd-in-spark-and-why-do-we-need-it


Spark 中的RDD是个什么东东,我们为什么需要它?



就快速执行诸如机器学习这样的迭代处理算法而言,Apache Spark 已经在通常情况下赶超了Hadoop(MapReduce),因为它提供了非常多的好处。


这篇博文中,我们将会试着去理解到底是什么让spark RDD在批处理分析中如此的有用。


1为什么是RDD?

当提到分布式迭代计算,例如,通过多个job的计算来处理数据,类似有逻辑回归,K-means聚类,Page rank算法,在多个job中重用或者共享数据,又或者你可能希望在一个共享数据集中执行多个即席查询,这些都相当普遍。


在现有的分布式计算系统(比如MapReduce)中实现数据重用和数据共享有一个潜在的问题,即你需要将一些中间结果数据存储在稳定的分布式存储中,比如说HDFS或者Amazon S3。这就使得整个job的计算非常缓慢,因为它在处理过程中涉及到很多的IO操作,数据复制和数据序列化操作。



MapReduce中的迭代处理


RDDs ,试图在分布式内存计算中启用容错机制来解决这些问题。



Spark中的迭代处理


现在,让我们看一下RDD到底是什么以及它怎样实现容错的。


2RDD ——弹性分布式数据集

RDDs 是不可改变的并且已分区的记录集合,它只能够通过类似map,filter,group by等等粗粒度的操作所创建,这意味着,这些操作是被应用到数据集中的所有元素上的。RDDs 只能够通过从一个诸如HDFS这样的稳定存储中读取数据而创建,或者通过在现有RDDs上的转换操作来创建。


现在,它是怎样起到容错的作用呢?


由于RDDs是通过一系列转换操作创建的,它记录了这些转换操作,而并不是真正的数据。产生一个RDD的转换操作组成的图谱被叫做Lineage Graph。


例如:firstRDD=spark.textFile("hdfs://...")secondRDD=firstRDD.filter(someFunction);thirdRDD = secondRDD.map(someFunction);



Spark RDD Lineage Graph


为了防止我们丢失RDD的一些分区,我们可以在那个丢失的分区上重新运行lineage中的转换操作来实现同样的计算,而不是跨越多个节点重新复制数据。这个特点是RDD最大的利益所在,因为它在数据管理和数据复制方面节省了很多努力,并因此实现了更加快速的计算性能。


1 0