Spark持久化详解
admin
2024-02-06 17:23:05

Spark持久化

1 血缘,缓存,rdd机制

rdd算子本身记录的是元数据,比如某个数据在某个区。他自己不存储数据本身。

(只存储分区和计算方法的数据)

所以 血缘关系(运算流程)或者RDD可以重用 但是数据不可重用

这意味着每次调用都需要 重新运算

这也是为什么 缓存或者持久化可以提升运行10倍运行速度的原因

因为之前数据虽然在内存里计算,但是并没有存储下来。持久化和缓存才是记录了数据。

rdd1=map(sss)
rdd2=rdd1.reducebykey

rdd1实际没有保存数据,只记录了血缘。所以当rdd2调用rdd1时。rdd1得重头计算一次。

2 RDD中cache,persist,checkpoint的区别

cache

数据会被缓存到内存来复用

血缘关系中添加新依赖

作业执行完毕时,数据会丢失

persist

保存在内存或磁盘

因为有磁盘IO,所以性能低,但是数据安全

作业执行完毕,数据会丢失

checkpoint

数据可以长时间保存到磁盘中

涉及磁盘IO,读取慢但安全。

独立作业

与cache配合使用,比如checkpoint后再cache一下,这样后续调用可以从cache里取

会切断血缘信息,重新建立新的血缘

checkpoint相当于改变数据源

3 Tips

触发方式:并不是立即缓存,当有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

相关内容

热门资讯

最新或2023(历届)最新中山... 要用三年时间提高低工资收入人群的收入,使其达到平均水平。 工资制度改革,并不是简单增加工资,而是重在...
最新或2023(历届)广东中山... 要用三年时间提高低工资收入人群的收入,使其达到平均水平。 工资制度改革,并不是简单增加工资,而是重在...
最新或2023(历届)北京最新... 要用三年时间提高低工资收入人群的收入,使其达到平均水平。 工资制度改革,并不是简单增加工资,而是重在...
最新或2023(历届)退休人员... 要用三年时间提高低工资收入人群的收入,使其达到平均水平。 工资制度改革,并不是简单增加工资,而是重在...
最新或2023(历届)最新教师... 要用三年时间提高低工资收入人群的收入,使其达到平均水平。 工资制度改革,并不是简单增加工资,而是重在...