是否自动激活缓存rdds?

时间:2016-05-17 20:22:52

标签: hadoop apache-spark yarn

我正在提交一份火花工作(spark-submit)。

问题

我正在通过从HDFS读取avro文件来加载rdd 然后我过滤了rdd&算一下(工作-1) 然后我使用不同的标准再次过滤它并计算它(作业-2)。

  • 在日志中,我看到FileInputFormat第一次读取60个文件。但它第二次没有读取任何文件。
  • 当我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吗?

最后,第二次计数比第一次更快,这让我相信数据在内存中......

2 个答案:

答案 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或其变体。