Spark RDD的缓存 rdd.cache() 和 rdd.persist()
来源:互联网 发布:知乎搞笑问题 编辑:程序博客网 时间:2024/05/22 07:56
RDD的缓存级别
顺便看一下RDD都有哪些缓存级别,查看 StorageLevel 类的源码:
object StorageLevel { val NONE = new StorageLevel(false, false, false, false) val DISK_ONLY = new StorageLevel(true, false, false, false) val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2) val MEMORY_ONLY = new StorageLevel(false, true, false, true) val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2) val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false) val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2) val MEMORY_AND_DISK = new StorageLevel(true, true, false, true) val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2) val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false) val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2) val OFF_HEAP = new StorageLevel(false, false, true, false) ......}
查看其构造函数
class StorageLevel private( private var _useDisk: Boolean, private var _useMemory: Boolean, private var _useOffHeap: Boolean, private var _deserialized: Boolean, private var _replication: Int = 1) extends Externalizable { ...... def useDisk: Boolean = _useDisk def useMemory: Boolean = _useMemory def useOffHeap: Boolean = _useOffHeap def deserialized: Boolean = _deserialized def replication: Int = _replication ......}
可以看到StorageLevel类的主构造器包含了5个参数:
useDisk:使用硬盘(外存)
useMemory:使用内存
useOffHeap:使用堆外内存,这是Java虚拟机里面的概念,堆外内存意味着把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机)。这样做的结果就是能保持一个较小的堆,以减少垃圾收集对应用的影响。
deserialized:反序列化,其逆过程序列化(Serialization)是java提供的一种机制,将对象表示成一连串的字节;而反序列化就表示将字节恢复为对象的过程。序列化是对象永久化的一种机制,可以将对象及其属性保存起来,并能在反序列化后直接恢复这个对象。序列化方式存储对象可以节省磁盘或内存的空间,一般 序列化:反序列化=1:3
replication:备份数(在多个节点上备份)
理解了这5个参数,StorageLevel 的12种缓存级别就不难理解了。
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2) 就表示使用这种缓存级别的RDD将存储在硬盘以及内存中,使用序列化(在硬盘中),并且在多个节点上备份2份(正常的RDD只有一份)
另外还注意到有一种特殊的缓存级别
val OFF_HEAP = new StorageLevel(false, false, true, false)
使用了堆外内存,StorageLevel 类的源码中有一段代码可以看出这个的特殊性,它不能和其它几个参数共存。
Spark RDD Cache
允许将RDD缓存到内存中或磁盘上, 以便于重用
Spark提供了多种缓存级别, 以便于用户根据实际需求进行调整
Spark RDD cache/persist
RDD cache使用
val data = sc.textFile(“hdfs://nn:8020/input”)data.cache() //实际上是data.persist(StorageLevel.MEMORY_ONLY)//data.persist(StorageLevel.DISK_ONLY_2)
cache和persist的区别
基于Spark 1.4.1 的源码,可以看到
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */def cache(): this.type = persist()
说明是cache()调用了persist(), 想要知道二者的不同还需要看一下persist函数:
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
可以看到persist()内部调用了persist(StorageLevel.MEMORY_ONLY),继续深入:
/** * Set this RDD's storage level to persist its values across operations after the first time * it is computed. This can only be used to assign a new storage level if the RDD does not * have a storage level set yet.. */def persist(newLevel: StorageLevel): this.type = { // TODO: Handle changes of StorageLevel if (storageLevel != StorageLevel.NONE && newLevel != storageLevel) { throw new UnsupportedOperationException( "Cannot change storage level of an RDD after it was already assigned a level") } sc.persistRDD(this) // Register the RDD with the ContextCleaner for automatic GC-based cleanup sc.cleaner.foreach(_.registerRDDForCleanup(this)) storageLevel = newLevel this}
可以看出来persist有一个 StorageLevel 类型的参数,这个表示的是RDD的缓存级别。
至此便可得出cache和persist的区别了:cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
- Spark RDD的缓存 rdd.cache() 和 rdd.persist()
- Spark RDD的缓存 rdd.cache() 和 rdd.persist()
- Spark RDD中cache和persist的区别
- Spark RDD中cache和persist的区别
- RDD中cache和persist的区别
- RDD中cache和persist的区别
- spark 2.1 RDD persist process
- Spark RDD 缓存
- Spark RDD Cache算子的作用
- 【spark RDD】RDD编程
- 走进spark(二) rdd.persist
- spark RDD的理解
- 理解Spark的RDD
- spark RDD的原理
- Spark RDD的转换
- Spark RDD的动作
- spark RDD的理解
- Spark RDD的理解
- 测量坐标系换算的安卓程序开发
- 为什么w要找s做经纪人?------聊聊软件系统中agent的构思与作用
- Android折线走势图
- 远程访问 MySQL
- 杭电oj--2005
- Spark RDD的缓存 rdd.cache() 和 rdd.persist()
- Ubuntu:128M下运行MySQL
- 2017去哪儿网在线笔试(二)
- pyChar之SyntaxError: Non-ASCII character问题
- SonarQube静态代码分析实战
- LeetCode
- JavaScript全栈学习笔记(一)
- 设计模式之状态模式
- Qt线程同步