Apache Spark Cache无法正常工作

时间:2016-12-15 08:03:09

标签: caching apache-spark rdd

我正在运行一个非常简单的程序来计算S3文件中的单词

 JavaRDD<String> rdd = sparkContext.getSc().textFile("s3n://" + S3Plugin.s3Bucket + "/" + "*", 10);

    JavaRDD<String> words = rdd.flatMap(s -> java.util.Arrays.asList(s.split(" ")).iterator()).persist(StorageLevel.MEMORY_AND_DISK_SER());
    JavaPairRDD<String, Integer> pairs = words.mapToPair(s -> new Tuple2<String, Integer>(s, 1)).persist(StorageLevel.MEMORY_AND_DISK_SER());
    JavaPairRDD<String, Integer> counts = pairs.reduceByKey((a, b) -> a + b).persist(StorageLevel.MEMORY_AND_DISK_SER());
    //counts.cache();

    Map m = counts.collectAsMap();

    System.out.println(m);

多次运行程序后,我可以看到多个条目

Storage entries

这意味着每次我运行该过程时,它都会继续创建新的缓存。

每次运行脚本所花费的时间保持不变。

同样,当我运行程序时,我总是会看到这些日志

[Stage 12:===================================================>     (9 + 1) / 10]

我的理解是,当我们缓存Rdds时,它不会再次执行操作并从缓存中获取数据。

所以我需要理解为什么Spark不使用缓存的rdd,而是在再次运行进程时创建一个新的缓存条目。

spark是否允许在Jobs中使用缓存的rdd,或者仅在当前上下文中可用

2 个答案:

答案 0 :(得分:0)

缓存数据仅在Spark应用程序的长度内持续存在。如果再次运行该应用程序,则无法使用先前运行的应用程序的缓存结果。

答案 1 :(得分:-1)

在日志中它将显示总阶段,但是当你转到localhost:4040时,你可以看到由于缓存而有一些任务跳过,因此使用spark UI localhost更正确地监视作业:4040