《从0到1学习spark》-- RDD特点精讲

今天小强给大家精讲下RDD的特点,RDD表示只读的分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从父RDD衍生所必需的信息。下面是RDD的特点介绍:**

分区

RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。

7187100-ac63a143ef8bf71f
image

只读

RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。

7187100-75d0722a59ed744b
image

由一个RDD转换到另一个RDD,可以通过丰富的操作算子实现,不再像MapReduce那样只能写map和reduce了

7187100-cd17f4c15edcaf5a
image

RDD的操作算子包括两类,一类叫做转换算子transformations,它是用来将RDD进行转化,构建RDD的血缘关系;另一类叫做行为算子actions,它是用来触发RDD的计算,得到RDD的相关计算结果或者将RDD保存的文件系统中。****RDD所支持的操作算子列表

7187100-e0f74b83926a9231
image

依赖

RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生所必需的信息,RDDs之间维护着这种血缘关系,也称之为依赖。依赖包括两种,一种是窄依赖,RDDs之间分区是一一对应的,另一种是宽依赖,下游RDD的每个分区与上游RDD(也称之为父RDD)的每个分区都有关,是多对多的关系。

7187100-7c60ed3758166192
image

通过RDDs之间的这种依赖关系,一个任务流可以描述为DAG(有向无环图),在实际执行过程中宽依赖对应于Shuffle(图中的reduceByKey和join),窄依赖中的所有转换操作可以通过类似于管道的方式一气呵成执行(图中map和union可以一起执行)。

7187100-6358968f8607be3d
image

缓存

如果在应用程序中多次使用同一个RDD,可以将该RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如图,RDD-1经过一系列的转换后得到RDD-n并保存到hdfs,RDD-1在这一过程中会有个中间结果,如果将其缓存到内存,那么在随后的RDD-1转换到RDD-m这一过程中,就不会计算其之前的RDD-0了。

7187100-9378bb48740a154e
image

checkpoint

虽然RDD的血缘关系天然地可以实现容错,当RDD的某个分区数据失败或丢失,可以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势必影响性能。为此,RDD支持checkpoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为checkpoint后的RDD不需要知道它的父RDDs了,它可以从checkpoint处拿到数据。

总结

今天这篇文章主要介绍了RDD的特点,包括分区、只读、依赖、缓存和checkpoint,想必大家应该对spark中神器RDD有个更加深入的理解,下期将介绍RDD依赖关系和DAG。希望大家有所收获,感觉不错就转发给更多的人!

猜你喜欢

转载自blog.csdn.net/weixin_34112900/article/details/87201403