相信大家都有这样的经历,当家里要来客人的时候会提前去买一大包食材准备用来招待,,可是每一个食材的保存时间是不一样的啊,那怎么办?我们会将食物进行分别存放有的放了桌子上,有的放冰箱里,这就是持久化的思想,当我们有目的之后,我们会去将计算结果进行存储,可是存储在哪里呢,如果放到磁盘中,我们的存储量虽然大了,但是问题是他的处理速度很慢,每次都需要去拿取数据然后在进行处理,对于磁盘的读写速度都是一个限制,而在电脑中的存储方面,内存虽然存储容量不是很大但是它的运行和读写效率是磁盘的好几十倍,所以大神们开始想能不能将数据优先存放在内存中,当内存存储不够的时候在转移到磁盘上进行存储,这也就是我们之后的持久化
Spark持久化算子:cache和persist
正常我们对于RDD的使用是这样的
val rdd1=sc.textfile(“++++” )
Rdd1.****.***.count
Rdd1.**.**.count
都是同样的数据,但是每一次使用都要重新的计算,影响计算的效率,浪费时间,但是当持久化之后
Val rdd1 = sc.textfile(“+++”)
Val rdd2=rdd1.cache
Rdd2.****.***.count
Rdd2.**.**.count
将rdd1的数据持久化到内存中,后面如果使用到这个数据可以直接复用,提高了效率
其实cache是persist的一个默认级别,persist(MEMORY_ONLY),在内部实现上是相同的,都是将数据持久化到内存中,当需要数据进行计算的时候直接从内存中将数据拿过来进行使用,关于持久化的级别在之前进行过讲解这里就不讲解了,按照顺序就是下面的表格,
持久化的注意事项
1、当持久化RDD的时候,每个节点存储在他内存中计算的任何分区上并进行重用
2、持久化的时候,第一次操作中计算结果将保存到节点上的内存中
3、Spark的缓存是容错的
4、每个RDD的持久化都可以选择不同的存储级
5、Shuffle过程中即使没有持久化也会保存一些中间数据,如果要重用这些数据建议进行持久化
如何选择持久化的级别:
1、RDD与默认存储级别相适应(MEMORY_ONLY),就使用默认级别
2、如果RDD与默认存储级别不适应,请尝试使用MEMORY_ONLY_SER和选择快速序列化库使物体的空间效率更高,但仍然可以合理地快速访问。(Java和Scala)
3、除非计算数据集的函数很昂贵或者数据量特别巨大,不要泄漏到磁盘。否则,重新计算分区的速度可能与从磁盘读取分区的速度一样快。
4、如果您想要快速故障恢复(例如,如果使用SPark来服务Web应用程序的请求),请使用复制的存储级别
如果更好地见解或者我的理解有问题欢迎进行交流
交流QQ群:859121793
微信公众号:刚哥人工智能1000集