persist(DISK_ONLY) 与手动保存到 HDFS 并回读之间的区别
Differences between persist(DISK_ONLY) vs manually saving to HDFS and reading back
这个答案清楚地解释了 RDD persist() 和 cache() 及其必要性 - (Why) do we need to call cache or persist on a RDD
所以,我知道调用 someRdd.persist(DISK_ONLY) 是懒惰的,但是 someRdd.saveAsTextFile("path") 是急切的。
但是除此之外(也忽略手动清理存储在HDFS中的文本文件),使用persist将rdd缓存到磁盘与手动从磁盘写入和读取之间是否有任何其他差异(性能或其他方面)?
有理由偏爱其中之一吗?
更多上下文:我遇到了手动写入 HDFS 并在我们的生产应用程序中读回的代码。我刚开始学习 Spark,想知道是否可以用 persist(DISK_ONLY) 代替它。请注意,HDFS 中保存的 rdd 在每个新的 运行 作业之前被删除,并且此存储的数据不用于 运行 之间的任何其他内容。
至少有这些差异:
- 写入 HDFS 会有副本开销,而缓存是在执行器本地写入的(如果选择
DISK_ONLY_2
,则写入第二个副本)。
- 写入 HDFS 是持久的,而缓存数据可能会丢失 if/when 执行程序因任何原因被杀死。您已经提到了在整个应用程序出现故障时写入 HDFS 的好处。
- 缓存不会更改分区,但从 HDFS might/will 读取会导致与原始写入 DataFrame/RDD 不同的分区。比如小的分区(文件)会聚合,大的文件会拆分。
我通常更喜欢缓存 small/medium 评估成本高的数据集,并将更大的数据集写入 HDFS。
这个答案清楚地解释了 RDD persist() 和 cache() 及其必要性 - (Why) do we need to call cache or persist on a RDD
所以,我知道调用 someRdd.persist(DISK_ONLY) 是懒惰的,但是 someRdd.saveAsTextFile("path") 是急切的。
但是除此之外(也忽略手动清理存储在HDFS中的文本文件),使用persist将rdd缓存到磁盘与手动从磁盘写入和读取之间是否有任何其他差异(性能或其他方面)? 有理由偏爱其中之一吗?
更多上下文:我遇到了手动写入 HDFS 并在我们的生产应用程序中读回的代码。我刚开始学习 Spark,想知道是否可以用 persist(DISK_ONLY) 代替它。请注意,HDFS 中保存的 rdd 在每个新的 运行 作业之前被删除,并且此存储的数据不用于 运行 之间的任何其他内容。
至少有这些差异:
- 写入 HDFS 会有副本开销,而缓存是在执行器本地写入的(如果选择
DISK_ONLY_2
,则写入第二个副本)。 - 写入 HDFS 是持久的,而缓存数据可能会丢失 if/when 执行程序因任何原因被杀死。您已经提到了在整个应用程序出现故障时写入 HDFS 的好处。
- 缓存不会更改分区,但从 HDFS might/will 读取会导致与原始写入 DataFrame/RDD 不同的分区。比如小的分区(文件)会聚合,大的文件会拆分。
我通常更喜欢缓存 small/medium 评估成本高的数据集,并将更大的数据集写入 HDFS。