spark 会自动缓存 rdds 吗?
Does spark cache rdds automatically?
我正在提交 spark 作业 (spark-submit)。
问题
我正在通过从 HDFS 读取 avro 文件来加载一个 rdd。
然后我过滤 rdd 并计算它 (job-1).
然后我使用不同的标准再次过滤它并计算它 (job-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]
是什么意思? 我认为 RDD 有一个句柄,所以我不确定重复使用同一个句柄有什么意义将会?
当我执行第一个 count
时,我在日志中看到:
FileInputFormat: Total input paths to process : 60
但是我没有看到第二次计数的类似日志。 records
Rdd 不应该重新加载吗?
最后,第二次计数比第一次计数快,这让我相信数据在内存中...
对于这一行,FileInputFormat: Total input paths to process : 60
,它属于RDD的元数据。这个在 NewHadoopRDD.getPartitions
中输出。它很懒,但只运行一次。你可以说 RDD 的元数据是缓存的。但是这个RDD的数据(文件中的数据)并没有被缓存。
Does spark cache rdds automatically?
有时,是的。在随机播放的情况下,RDD 会自动缓存。
例如,您可能已经在 spark Web UI 中观察到 "skipped stages"。
参见:https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations
在其他情况下,您需要调用 rdd.cache
或其变体。
我正在提交 spark 作业 (spark-submit)。
问题
我正在通过从 HDFS 读取 avro 文件来加载一个 rdd。
然后我过滤 rdd 并计算它 (job-1).
然后我使用不同的标准再次过滤它并计算它 (job-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]
是什么意思? 我认为 RDD 有一个句柄,所以我不确定重复使用同一个句柄有什么意义将会?
当我执行第一个 count
时,我在日志中看到:
FileInputFormat: Total input paths to process : 60
但是我没有看到第二次计数的类似日志。 records
Rdd 不应该重新加载吗?
最后,第二次计数比第一次计数快,这让我相信数据在内存中...
对于这一行,FileInputFormat: Total input paths to process : 60
,它属于RDD的元数据。这个在 NewHadoopRDD.getPartitions
中输出。它很懒,但只运行一次。你可以说 RDD 的元数据是缓存的。但是这个RDD的数据(文件中的数据)并没有被缓存。
Does spark cache rdds automatically?
有时,是的。在随机播放的情况下,RDD 会自动缓存。
例如,您可能已经在 spark Web UI 中观察到 "skipped stages"。
参见:https://spark.apache.org/docs/1.5.0/programming-guide.html#shuffle-operations
在其他情况下,您需要调用 rdd.cache
或其变体。