rdd算子本身记录的是元数据,比如某个数据在某个区。他自己不存储数据本身。
(只存储分区和计算方法的数据)
所以 血缘关系(运算流程)或者RDD可以重用 但是数据不可重用
这意味着每次调用都需要 重新运算。
这也是为什么 缓存或者持久化可以提升运行10倍运行速度的原因
因为之前数据虽然在内存里计算,但是并没有存储下来。持久化和缓存才是记录了数据。
rdd1=map(sss)
rdd2=rdd1.reducebykey
rdd1实际没有保存数据,只记录了血缘。所以当rdd2调用rdd1时。rdd1得重头计算一次。
数据会被缓存到内存来复用
血缘关系中添加新依赖
作业执行完毕时,数据会丢失
保存在内存或磁盘
因为有磁盘IO,所以性能低,但是数据安全
作业执行完毕,数据会丢失
数据可以长时间保存到磁盘中
涉及磁盘IO,读取慢但安全。
独立作业
与cache配合使用,比如checkpoint后再cache一下,这样后续调用可以从cache里取
会切断血缘信息,重新建立新的血缘
checkpoint相当于改变数据源
触发方式:并不是立即缓存,当有action被触发时才调用。
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 = _useDiskdef useMemory: Boolean = _useMemorydef useOffHeap: Boolean = _useOffHeapdef deserialized: Boolean = _deserializeddef replication: Int = _replication......
}
offheap就是jvm的堆内存以外的内存。操作系统管理的内存,降低GC压力。
deserialized时反序列化,按java的方式加载数据。
副本数是在多少个节点上备份。
cache方法其实也是调用persist,只不过参数是memort_only
persist默认参数是disk_only
上一篇:quiet的反义词是什么
下一篇:双手造句一年级