spark 基础二:RDD操作和持久化

Spark RDD操作

Spark支持两种RDD操作,transformation和action。transformation操作会针对已有的RDD创建一个新的RDD;而action则主要是对RDD进行最后的操作,比如遍历、reduce、保存到文件等,并可以返回结果给Driver程序。
Transformation的特点就是lazy特性。lazy特性值得是,如果一个spark应用中只定义了transformation操作,那么即使你执行该应用,这些操作也不会执行,也就是说,transformation是不会触发spark程序的执行的,他们只是记录了对RDD的操作,但是不会自发的执行;只有当transformation之后,接着执行了一个action操作,那么所有的transformation才会执行。Spark通过这种lazy特性,来进行底层的spark应用执行的优化,避免产生过多的中间结果。

action操作执行,会触发一个spark job的运行,从而触发这个action之前所有的transformation的执行,

下面通过图来说明transformation和action特性


spark 基础二:RDD操作和持久化_第1张图片
image.png

如上图所示,只有当执行action操作之后,才会触发job的执行,才会提交task到worker的Executor上执行,也就是上一篇spark基础中spark应用在spark集群上的执行步骤 5、 6、 7

常用transtormation

spark 基础二:RDD操作和持久化_第2张图片
image.png

常用Action操作

spark 基础二:RDD操作和持久化_第3张图片
image.png

Spark持久化

Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的pattition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition。这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD。
官方文档上说,巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍。对于迭代式算法和快速交互式应用来说,RDD持久化,是非常重要的。
要持久化一个RDD,只要调用器cache()或者persist()方法即可,在该RDD第一次被计算出来时,就会被直接缓存在每个节点中。而且spark持久化机制是自动容错的,如果持久化的RDD的任何partition丢失了,那么spark会自动通过其源RDD,使用transformation操作重新计算该partition。
spark自己也会在shuffle操作时,进行数据的持久化,比如写入磁盘,只要是wield在节点失败时,避免需要重新计算整个过程。
下面以画图来说明这个过程


spark 基础二:RDD操作和持久化_第4张图片
image.png
spark 基础二:RDD操作和持久化_第5张图片
image.png

RDD持久化策略

RDD持久化是可以选择不同的策略的,比如可以将RDD持久化在内存中,磁盘上,使用序列化的方式持久化,将持久化的数据进行多路复用。只要在调用persist()时,传入对应的StorageLevel即可。


spark 基础二:RDD操作和持久化_第6张图片
image.png

如何选择RDD持久化策略?

Spark提供的多种持久化级别,主要是为了在CPU和内存消耗之间进行取舍,下面是一些通用的持久化级别的选择建议:
1、优先使用MEMORY_ONLY,如果可以缓存所有的数据的话,那么久使用这种策略,因为纯内存书读最快,而且没有序列化,不需要消耗CPU 进行反序列化操作
2、如果MEMORY_ONLY策略,无法存储下所有的数据的话,那么使用MEMORY_ONLY_SER,将数据进行序列化存储,纯内存操作还是非常快,只是要消耗cpu进行反序列化
3、如果需要进行快速的失败恢复,那么就选择后缀为_2的策略,进行数据的备份,这样在失败时,就不需要重新计算了
4、能不使用DISK相关的策略,就不使用,有的时候,从磁盘读取数据,还不如重新计算一次

你可能感兴趣的:(spark 基础二:RDD操作和持久化)