Spark--RDD持久化
相信大家都知道的一个常识,在计算机的硬件中能够进行存储的就是内存和硬盘两个硬件,但是同样的,大家也很清楚,在同样的数据处理的读写过程中,硬盘和内存的运行效率差距是非常大的,而内存作为硬盘和cpu进行数据交换的中转站,属于临时存储器,虽然通过快速的数据传输速度弥补了硬盘容量大但是传送速度慢的特点,所以当计算在内存上进行会比磁盘上进行要快很多。
相信开车的朋友都知道,同样性能的车,在比较堵的城市道路上和高速公路上行驶同样的路程消耗的时间和油量是不一样的,甚至差距很大,尤其是在时间上,那么Spark就是这辆性能优越的兰博基尼跑车,而在内存上运行就是高速公路,磁盘就是普通的乡镇小路,如果他每一次的计算都是从磁盘拉取数据然后将结果写会磁盘,重复这个操作直到此次计算完成,我觉得从我的叙述中应该也感觉出来了,太麻烦了,浪费时间浪费效率,那应该怎么处理呢?
Spark在计算的算子中有两个特殊的算子:cache、persist,这两个算子的作用就是对RDD的数据进行持久化操作。
算子介绍:
Cache:通过持久化RDD的计算结果来提高执行效率。将RDD的计算结果持久化到内存中进行处理,在内部实际上是调用的persist(memory_only)方法,但是在使用cache的时候有两个注意点。1、需要action类算子触发执行,但不能立即紧跟。2、防止数据误读
Persist:persist在本质上跟cache是基本相同的,都是将计算结果持久化到内存中,提升了计算效率,但是,persist的一个最高级的方面就是他可以自主的指定持久化级别
在persist的定义中有包括memory_only在内的7种持久化级别,可以根据不同的需求场景对于RDD的持久化级别进行相应的设置
那如何选取合适的持久化级别呢?在Spark官网上对于这个进行了相应的解释:
1、RDD与默认存储级别相适应(MEMORY_ONLY),就使用默认级别
2、如果RDD与默认存储级别不适应,请尝试使用MEMORY_ONLY_SER和选择快速序列化库使物体的空间效率更高,但仍然可以合理地快速访问。(Java和Scala)
3、除非计算数据集的函数很昂贵或者数据量特别巨大,不要泄漏到磁盘。否则,重新计算分区的速度可能与从磁盘读取分区的速度一样快。
4、如果您想要快速故障恢复(例如,如果使用SPark来服务Web应用程序的请求),请使用复制的存储级别
这四种选择的级别是一个简单的介绍,具体的还是需要在实际的操作过程中进行相应的选择
但是,凡事都有双面性,Spark在可以进行快速的数据处理的并且提供了这种持久化级别的选择之下,肯定也存在着它带来的麻烦,
在算子的使用上,持久化算子和transformation算子一样,都是action算子的触发之后才能执行,
当持久化RDD的时候,每个节点存储在他内存中计算的任何分区上并进行重用
持久化的时候,第一次操作中计算将保存到节点上的内存中
Spark的缓存是容错的,当有RDD分区出现问题之后,可以去重新拉去生成RDD的计算数据自动进行重新计算
每个RDD的持久化都可以选择不同的存储级
Shuffle过程中即使没有持久化也会保存一些中间数据,如果要重用这些数据建议进行持久化
这就是关于RDD的持久化,如果更好地见解或者我的理解有问题欢迎进行交流
交流QQ群:859121793
微信公众号:刚哥人工智能1000集