Spark(Persist)

RDD的持久化

可以使用persist(StorageLevel)或者cache()方法,数据会在第一次计算后缓存在各节点的内存里
Spark的缓存具有容错机制,如果RDD中的任何一个缓存分区丢失,Spark会按照原来的计算过程自动地重新计算并缓存。
在shuffle操作中(例如reduceByKey),即便用户没有调用persist方法,Spark也会自动缓存部分中间数据。
这样做的目的是,在shuffle过程中如果某个节点计算异常,则不需要重新计算全部的输入数据。
如果用户想多次使用某个RDD,仍然建议调用persist方法去持久化RDD


Java/Scala RDD的持久化

每个持久化的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 RDD的持久化

在Python中,不管你是否选择了序列化的方式,缓存的对象总是使用Pickle库进行序列化。
可用的存储方式:
    MEMORY_ONLY
    MEMORY_AND_DISK
    DISK_ONLY
    
    MEMORY_ONLY_2, MEMORY_AND_DISK_2, DISK_ONLY_2 与上述方式一样,但同时会对每一个分区数据在集群的两个节点上创建副本


RDD的删除

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章