为什么要持久化
action操作时,触发之前的transform算子,action执行完,只保留了最后的结果,之前的RDD会被丢掉,如果后面又要进行action操作,则需要从最初的RDD重新计算。rdd持久化后,只在第一次计算时,进行计算,之后再使用该RDD直接读取缓存,无需计算。持久化方式
persist()或cache(),二者的区别是,cache() 方法其实调用的就是persist()方法,缓存策略均为MEMORY_ONLY;持久化级别
MEMORY_ONLY:RDD作为反序列化的对象存储在内存中,若内存存不下, 一些partition不会被缓存,需要时重新计算,默认级别。
MEMORY_AND_DISK:RDD作为反序列化对象存在内存中,若内存存不下,超出的partition存入硬盘。
MEMORY_ONLY_SER:RDD作为序列化对象存在内存,空间利用率更高,读取时会占用cpu,可使用kyro序列化方式进行序列化。
MEMORY_AND_DISK_SER:RDD作为序列化对象存在内存中,若内存存不下,超出的partition存入硬盘。
DISK_ONLY:只将RDD分区存在硬盘上。
MEMORY_ONLY_2:在集群上存两份
MEMORY_AND_DISK_2:在集群上存两份持久化的优化点
如果内存不充足,可使用序列化的持久化级别对rdd进行持久化,序列化后RDD每个partition的数据都是一个字节数组,大大节省内存空间和磁盘io性能消耗,但是需要使用RDD时,要先对RDD进行反序列化增加性能开销。
使用kyro序列化,减少序列化后的空间,且具有更快的序列化速度。使用kyro序列化。自定义对象要先注册,缓存大小需要设置,默认2M。
RDD的持久化
最新推荐文章于 2022-05-08 11:40:39 发布