Spark 学习笔记----RDD持久化原理

1、RDD持久化的原理
Spark非常重要的一个功能特性,就是可以将RDD持久化到内存中,当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并在在之后对该RDD的反复使用中,直接使用内存缓存的partition。这样对于针对一个RDD的反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD。

2、RDD持久化的作用
巧妙使用RDD持久化,在某些场景下,可以将Spark应用程序的性能提升10倍,对于迭代式算法和快速交互式应用来说,RDD持久化是非常重要的。

3、RDD持久化的方法
调用RDD的cache()或者persist()方法即可,在该RDD第一次被计算出来时,就会直接缓存在每一个节点中,而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,Spark会自动通过其源RDD,使用transformation操作重新计算该partition

4、cache()与persist()的区别
cache()是persist()的一种简化方法,cache()的底层就是调用persist()的无参版本,同时就是调用persist(MEMORY_ONLY),将数据持久化到内存中。如果需要从内存中清除缓存,则可以使用unpersist()方法

5、注意
Spark自己也会在shuffle操作时,进行数据的持久化。比如写入磁盘,主要是为了在节点失败时,避免需要 计算整个过程

6、RDD持久化实战

        //cache()或者persist()的使用是有规则的
        //必须在transformation或者textFile等创建一个RDD之后,直接连续调用cache()或者persist()
        //如果先创建一个RDD,然后单独另起一行再执行cache()或者persist()是没有用的,而且会报错,大量的文件会丢失
        JavaRDD<String> lines = sc.textFile("文件路径").cache();
        //JavaRDD<String> lines = sc.textFile("文件路径").persist();

7、RDD持久化策略

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

持久化级别含义
MEMORY_ONLY以非序列化的Java对象的方式持久化在JVM内存中,如果内存无法完全存储RDD所有的partition,那么那些没有持久化的partition就会在下一次需要使用它的时候重新被计算。
MEMORY_AND_DISK同上,但是当某些partition无法存储在内存中时,会持久化到磁盘中,下次需要使用这些partition时,需要从磁盘上读取
MEMORY_ONLY_SER同MEMORY_ONLY,但是会使用Java序列化方式,将Java对象序列化后进行持久化,可以减少内存开销,但是需要进行反序列化,因此会加大CPU开销
MEMORY_AND_DISK_SER同MEMORY_AND_DISK,但是使用序列化方式持久化Java对象
DISK_ONLY使用非序列化Java对象的方式持久化,完全存储到磁盘上
MEMORY_ONLY_2 MEMORY_AND_DISK_2 等等如果是尾部加了2的持久化级别,表示会将持久化数据复用一份,保存到其他节点,从而在数据丢失时,不需要再次急促安,只需要使用备份数据即可

8、如何选择RDD持久化策略

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

本文为北风网Spark2.0培训视频的学习笔记
视频链接:https://www.bilibili.com/video/av19995678?p=52

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值