Spark RDD中的持久化

持久化在早期被称作缓存(cache),但缓存一般指将内容放在内存中。虽然持久化操作在绝大部分情况下都是将RDD缓存在内存中,但一般都会在内存不够时用磁盘顶上去(比操作系统默认的磁盘交换性能高很多)。当然,也可以选择不使用内存,而是仅仅保存到磁盘中。所以,现在Spark使用持久化(persistence)这一更广泛的名称。

如果一个RDD不止一次被用到,那么就可以持久化它,这样可以大幅提升程序的性能,甚至达10倍以上。默认情况下,RDD只使用一次,用完即扔,再次使用时需要重新计算得到,而持久化操作避免了这里的重复计算,实际测试也显示持久化对性能提升明显,这也是Spark刚出现时被人称为内存计算的原因。

持久化的方法是调用persist()函数,除了持久化至内存中,还可以在persist()中指定storage level参数使用其他的类型。

storage level参数

storage level

说明

MEMORY_ONLY

默认的持久化级别,只持久到内存中(以原始对象的形式),需要时直接访问,不需要反序列化操作。内存不足时,多余的部分不会被持久化,访问时需要重新计算

MEMORY_AND_DISK

持久化到内存中,内存不足时用磁盘代替

MEMORY_ONLY_SER

类似于MEMORY_ONLY,但格式是序列化之后的数据(每个分区一字节数组),可以更节省内存,代价是消耗CPU

MEMORY_AND_DISK_SER

类似于MEMORY_ONLY_SER,内存不足时用磁盘代替

DISK_ONLY

只使用磁盘

*_2,比如MEMORY_ONLY_2和MEMORY_AND_DISK_2等

与上面的级别类似,但数据还复制到集群的另外一个节点上,总共两份副本,可提升可用性

此外,RDD.unpersist()方法可以删除持久化。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

数据库的并发控制总结

932
来自专栏牛肉圆粉不加葱

[Spark Q&A]如果中间输出RDD在内存放不下会怎么样?

这个问题其实问的 RDD 缓存机制。我们可以调用 persist() 或 cache()方法来缓存 RDD。Spark 的缓存是具有容错性的,如果 RDD 的任...

712
来自专栏PHP技术

MySQL 在并发场景下的问题及解决思路

对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为...

1474
来自专栏Java架构沉思录

MySQL在并发场景下的优化手段

对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为...

822
来自专栏我的技术专栏

Java多线程编程—锁优化

1317
来自专栏编程坑太多

python进程和线程概述

1145
来自专栏Albert陈凯

4.3 RDD操作

4.3 RDD操作 RDD提供了一个抽象的分布式数据架构,我们不必担心底层数据的分布式特性,而应用逻辑可以表达为一系列转换处理。 通常应用逻辑是以一系列转换(...

2567
来自专栏行者悟空

Spark核心数据结构RDD的定义

1264
来自专栏技术博文

线程,进程和并发

进程 进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。 进程一般会包括指令集和系统资源集,这里的指...

2817
来自专栏数据库

记一次排查DB死锁的分析

文章摘要 在线上环境遇到数据库死锁问题该如何分析并解决问题呢? 虽然很多童鞋在学数据库课程时都了解数据库隔离级别、死锁和事务等概念,但在测试/线上环境遇到死锁却...

1858

扫码关注云+社区