我正在提交一份火花工作(spark-submit)。
问题
我正在通过从HDFS读取avro文件来加载rdd 然后我过滤了rdd&算一下(工作-1) 然后我使用不同的标准再次过滤它并计算它(作业-2)。
rdd.toDebugString
时,我看不到父rdd被缓存。详情
以下是代码:
JavaRdd<Record> records = loadAllRecords();
JavaRDD<Record> type1Recs = records.filter(selectType1());
JavaRDD<Record> type2Recs = records.filter(selectType2());
log.info(type1Recs.count());
log.info(type2Recs.count());
当我查看第一个计数的rdd调试信息时:
.....
.....
| MapPartitionsRDD[2] at filter at xxxx.java:61 []
| NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 []
当我查看第二次计数的rdd调试信息时:
.....
.....
| MapPartitionsRDD[5] at filter at EventRepo.java:61 []
| NewHadoopRDD[0] at newAPIHadoopRDD at xxxxx.java:64 []
如果我正在捕捉NewHadoopRDD,调试字符串中会有一些与之关联的捕获信息......
但是,我确实意识到在这两种情况下,RDD都被称为NewHadoopRDD[0]
。 这个上下文中的[0]
是什么意思?id?我认为RDD有一个句柄所以我不确定重用相同句柄的重要性是什么?
当我执行第一个count
时,我会在日志中看到:
FileInputFormat: Total input paths to process : 60
但我没有看到第二次计数的类似日志。不应该再次加载records
Rdd吗?
最后,第二次计数比第一次更快,这让我相信数据在内存中......
答案 0 :(得分:3)
对于此行FileInputFormat: Total input paths to process : 60
,它属于RDD的元数据。这个输出在NewHadoopRDD.getPartitions
。它很懒,但只运行一次。您可以说RDD的元数据已缓存。但是这个RDD的数据(文件中的数据)没有被缓存。
答案 1 :(得分:2)
自动火花缓存rdds吗?
有时,是的。在随机播放的情况下,RDD会自动缓存。
例如,您可能已在Spark Web UI中观察到“跳过的阶段”。
请参阅:https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations
在其他情况下,您需要致电rdd.cache
或其变体。