Spark编程指南入门之Java篇六-RDD持久化介绍

10. RDD持久化

Spark其中一个重要的功能是持久化(或缓存)数据到内存。当持久化一个RDD时,每一个节点会把计算后的分区数据保存在内存里面,然后后续的操作可以直接重用内存里的数据。这样可以提高后续操作的计算速度(通常是10倍以上)。缓存是迭代算法和快速交互式使用的关键工具。

RDD的持久化可以使用persist()或者cache()方法,数据会在第一次计算后缓存在各节点的内存里。Spark的缓存具有容错机制,如果RDD中的任何一个缓存分区丢失,Spark会按照原来的计算过程自动地重新计算并缓存。

另外,每个持久化的RDD可以使用不同的存储方式进行缓存,例如,持久化到磁盘、序列化的Java对象到内存(节省空间)、跨节点复制。这些存储方式可以通过persist(StorageLevel)方法设置。cache()方法是使用默认存储方式StorageLevel.MEMORY_ONLY的快捷方法(将反序列化的对象存储到内存中)。下面是全部的存储方式:
  • MEMORY_ONLY 将RDD以反序列化Java对象的形式保存在JVM。如果内存空间不够,不能缓存在内存里面的某些分区数据会在需要使用时重新进行计算。这是默认的方式
  • MEMORY_AND_DISK 将RDD以反序列化Java对象的形式保存在JVM。如果内存空间不够,把不能缓存的分区数据保存到磁盘,在需要使用时从磁盘读取
  • MEMORY_ONLY_SER 将RDD以序列化的Java对象的形式保存在JVM中(每个分区为一个byte数组)。这种方式会比反序列化对象节省空间,特别是在使用快速序列化器(fast serializer)时会节省更多的空间,但是在读取时会增加CPU的使用率
  • MEMORY_AND_DISK_SER 与MEMORY_ONLY_SER类似,但会把不能缓存的分区数据保存到磁盘,而不是在需要使用时重新进行计算
  • DISK_ONLY 将RDD以反序列化Java对象的形式保存在磁盘
  • MEMORY_ONLY_2,MEMORY_AND_DISK_2,MEMORY_ONLY_SER_2,MEMORY_AND_DISK_SER_2,DISK_ONLY_2 与上述方式一样,但同时会对每一个分区数据在集群的两个节点上创建副本
  • OFF_HEAP (试验性功能) 与MEMORY_ONLY_SER类似,但会把分区数据保存到堆外内存(off-heap memory)。该方式需要启用堆外内存
注意,在Python中,不管你是否选择了序列化的方式,缓存的对象总是使用Pickle库进行序列化。Python可用的持久化方式有MEMORY_ONLY,MEMORY_ONLY_2,MEMORY_AND_DISK, MEMORY_AND_DISK_2,DISK_ONLY, and DISK_ONLY_2。在shuffle操作中(例如reduceByKey),即便用户没有调用persist方法,Spark也会自动缓存部分中间数据。这样做的目的是,在shuffle过程中如果某个节点计算异常,则不需要重新计算全部的输入数据。如果用户想多次使用某个RDD,仍然建议调用persist方法去持久化RDD

10.1 如何选择存储的方式?

Spark的这些存储方式用于在内存使用率和CPU效率之间提供不同的取舍。建议按下面的流程来选择:
  • 如果内存能够保存所有的RDD数据,那么就选择默认的MEMORY_ONLY存储方式。这种方式可以最大程度的提高CPU的效率,可以使得对RDD的操作尽可能的快
  • 如果内存不能保存所有的RDD数据,那么可以尝试使用MEMORY_ONLY_SER存储方式并选择一个快速序列化器,以便节省更多内存空间,但仍然保留较快的读取性能
  • 除非计算数据集的代价高,或者在需要过滤大量数据的情况下,尽量不要把数据保存到磁盘。因为,对分区数据重新计算可能和从磁盘读取耗时差不多
  • 如果需要快速故障恢复,建议使用复制的存储方式(例如,使用Spark处理web应用的请求)。所有的存储方式都提供重新计算丢失数据的全容错机制,但是复制的存储方式在发生数据丢失的时候,能够继续执行任务而不需要等待重新计算丢失的数据
10.2 删除数据

Spark会自动监控各个节点的缓存使用率,并根据最少使用的算法(LRU)将旧数据删除。如果想手动移除一个RDD而不是等待该RDD被Spark自动移除,可以使用RDD.unpersist()方法。

TO BE CONTINUED...O(∩_∩)O
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值