我正在运行一个非常简单的程序来计算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);
多次运行程序后,我可以看到多个条目
这意味着每次我运行该过程时,它都会继续创建新的缓存。
每次运行脚本所花费的时间保持不变。
同样,当我运行程序时,我总是会看到这些日志
[Stage 12:===================================================> (9 + 1) / 10]
我的理解是,当我们缓存Rdds时,它不会再次执行操作并从缓存中获取数据。
所以我需要理解为什么Spark不使用缓存的rdd,而是在再次运行进程时创建一个新的缓存条目。
spark是否允许在Jobs中使用缓存的rdd,或者仅在当前上下文中可用
答案 0 :(得分:0)
缓存数据仅在Spark应用程序的长度内持续存在。如果再次运行该应用程序,则无法使用先前运行的应用程序的缓存结果。
答案 1 :(得分:-1)
在日志中它将显示总阶段,但是当你转到localhost:4040时,你可以看到由于缓存而有一些任务跳过,因此使用spark UI localhost更正确地监视作业:4040