Spark - RDD持久化

概述

缓存是用Spark构建迭代算法的关键,通过缓存,Spark避免了RDD上的重复计算,能够极大的提升计算速度,在Spark程序的调优中就会考虑到RDD的持久化机制。对于迭代算法和快速交互式应用来说,RDD持久化是非常重要的。Spark的持久化机制是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算partition.

持久化方法

cache() = persist(MEMORY_ONLY)
persist

注意点

持久化单位为Partition时,当使用RDD的MEMORY_ONLY进行持久化的时候,当内存空间不够的时候,不会报OOM,它选择最小的Partition来持久化在内存,当重新使用RDD时,其他的Partition会根据依赖关系重新计算。持久化的级别StroageLevel可以自定义,但是一般不自定义,Spark也会自动持久化一些shuffle操作(如reduceByKey)中的中间数据,即使用户没有调用persisit方法。这样的好处是避免了shuffle出错的情况下,需要重复计算整个输入,如果用户计划重新用计算过程中产生的RDD,则仍然推荐使用persist方法,

如何选择持久化级别

spark的多个存储级别意味着在内存利用率和CPU利用率之间的不同权衡

  • MEMORY_ONLY,默认的,这是CPU利用率最高的选项,会使RDD上的操作尽可能快
  • MEMORY_ONLY_SER,选择一个更快的序列化库提高对象的空间利用率,但是仍能够相当快的访问
  • 除非函数计算RDD的花费较大,或它们需要过滤大量的数据,不要将RDD存储到磁盘上,否则,重复计算一个分区就会和从磁盘上读取数据一样慢
  • 如果你希望更快的错误恢复,可以利用重复存储级别,所有的存储级别都可以通过重复计算丢失的数据来支持完整的容错,但是重复的数据能够使你的RDD上继续运行任务,而不需要重复计算丢失的数据
  • 在拥有大量内存的环境中或者多应用程序的环境中,OFF_HEAP具有以下优势
    1)它运行多个执行者共享Tachyon中相同的内存池
    2)它显著的减少垃圾回收的花销
    3)如果单个执行崩溃,缓存的数据不会丢失
checkpoint

当业务场景非常复杂的时候,RDD的血缘依赖会非常的长,一旦血缘较后面的RDD数据丢失的时候,Spark会根据血缘依赖重新计算丢失的RDD,这样会造成计算的时间过长,Spark提供了一个Checkpoint来解决这样的业务场景

你可能感兴趣的:(Spark,checkpoint,RDD持久化)