美文网首页
RDD持久化

RDD持久化

作者: ibunny | 来源:发表于2017-03-28 13:08 被阅读314次

RDD持久化

Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition。这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD。

巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍。对于迭代式算法和快速交互式应用来说,RDD持久化,是非常重要的。

要持久化一个RDD,只要调用其cache()或者persist()方法即可。在该RDD第一次被计算出来时,就会直接缓存在每个节点中。而且Spark的持久化机制还是自动容错的,如果持久化的RDD的任何partition丢失了,那么Spark会自动通过其源RDD,使用transformation操作重新计算该partition

cache()persist()的区别在于,cache()persist()的一种简化方式,cache()的底层就是调用的persist()的无参版本,同时就是调用persist(MEMORY_ONLY),将数据持久化到内存中。如果需要从内存中清楚缓存,那么可以使用unpersist()方法。

Spark自己也会在shuffle操作时,进行数据的持久化,比如写入磁盘,主要是为了在节点失败时,避免需要重新计算整个过程。

不使用RDD持久化的问题 RDD持久化的工作原理
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

/**
 * RDD持久化
 * @author Administrator
 *
 */
public class Persist {

    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("Persist")
                .setMaster("local"); 
        JavaSparkContext sc = new JavaSparkContext(conf);
        
        // cache()或者persist()的使用,是有规则的
        // 必须在transformation或者textFile等创建了一个RDD之后,直接连续调用cache()或persist()才可以
        // 如果你先创建一个RDD,然后单独另起一行执行cache()或persist()方法,是没有用的
        // 而且,会报错,大量的文件会丢失
        JavaRDD<String> lines = sc.textFile("C://Users//Administrator//Desktop//spark.txt")
                .cache();
        // lines.cache()是不行的!!

        long beginTime = System.currentTimeMillis();
        
        long count = lines.count();
        System.out.println(count);  
        
        long endTime = System.currentTimeMillis();
        System.out.println("cost " + (endTime - beginTime) + " milliseconds.");   
        
        beginTime = System.currentTimeMillis();
        
        count = lines.count();
        System.out.println(count);  
        
        endTime = System.currentTimeMillis();
        System.out.println("cost " + (endTime - beginTime) + " milliseconds.");
        
        sc.close();
    }
    
}

RDD持久化策略


RDD持久化是可以手动选择不同的策略的。比如可以将RDD持久化在内存中、持久化到磁盘上、使用序列化的方式持久化,多持久化的数据进行多路复用。只要在调用 persist()时传入对应的StorageLevel即可

Spark提供的多种持久化级别,主要是为了在CPU和内存消耗之间进行取舍。下面是一些通用的持久化级别的选择建议:

  1. 优先使用MEMORY_ONLY,如果可以缓存所有数据的话,那么就使用这种策略。因为纯内存速度最快,而且没有序列化,不需要消耗CPU进行反序列化操作。
  2. 如果MEMORY_ONLY策略,无法存储的下所有数据的话,那么使用MEMORY_ONLY_SER,将数据进行序列化进行存储,纯内存操作还是非常快,只是要消耗CPU进行反序列化。
  3. 如果需要进行快速的失败恢复,那么就选择带后缀为_2的策略,进行数据的备份,这样在失败时,就不需要重新计算了。
  4. 能不使用DISK相关的策略,就不用使用,有的时候,从磁盘读取数据,还不如重新计算一次。

相关文章

  • RDD持久化

    RDD持久化 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点...

  • RDD持久化策略

    RDD持久化是可以手动选择不同的策略的。比如可以将RDD持久化在内存中、持久化到磁盘上、使用序列化的方式持久化,多...

  • Spark RDD 持久化

    RDD Persistence Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久...

  • Spark RDD持久化级别

    RDD持久化用于RDD重用和节省重新计算,方便构建迭代算法,缓存粒度为整个RDD 持久化级别 如何选择存储级别? ...

  • spark的存储管理中的shuffle持久化

    与RDD持久化不同之处是:shuffle持久化必须是在磁盘;其次,每一个RDD基于磁盘的持久化都会有一个文件,而s...

  • Spark1.6.3 cache()和persist()

    RDD的持久化也就是说假如我们从hdfs读取文件,形成RDD。当我们对RDD进行持久化操作之后,,然后再针对该RD...

  • RDD持久化

    http://www.ccblog.cn/102.htm

  • RDD持久化

    rdd的持久化算子有三种: 1、cache:将数据持久化到内存 2、persist:可以将数据持久化到磁盘,也可以...

  • RDD持久化

    官网介绍 One of the most important capabilities in Spark is p...

  • RDD持久化

    为什么需要持久化 所谓的持久化,就是将数据进行保存,避免数据丢失。RDD持久化并非将数据落盘保存,而是用作缓存。了...

网友评论

      本文标题:RDD持久化

      本文链接:https://www.haomeiwen.com/subject/gtjjottx.html