我知道 localCheckpoint
删除了重建 RDD 所需的历史记录。 cache
保存 RDD 的当前状态,因此不需要重建它。
但是,我对几个方面感到困惑。如果我执行 localCheckpoint
,并且稍后在代码中需要此 RDD,我经常会收到关于如何不再找到分区的 Exception
异常。
我查看了sparkUI中的Storage
选项卡,它显示只保存了一小部分RDD,比如17%。
所以我阅读了更多内容并意识到 Spark 会丢弃旧的 RDD。 Spark 有没有办法永久保留它?
另外,如果我使用 cache
而不是 localCheckpoint
,问题会解决吗?但这只是需要时间,因为 Spark 必须重新计算分区?
总的来说,我只是想在我工作的大部分时间里将 RDD 保留在内存中,以便能够在最后将其合并回来,但当我到达那里时,Spark 已经删除了它。我该如何解决这个问题?
执行 localCheckpoint.cache
或 cache.localCheckpoint
有什么作用吗?或者其中之一就足够了?
最佳答案
您需要使用 localCheckpoint
与 checkpoint
的原因是什么?当使用 localCheckpoint
时,您的截断不进行复制,速度更快,但可靠性较差,这可能是您遇到麻烦的地方。
保存位置的一般差异:
cache
正在保存到内存(如果内存太大,无法保存到磁盘),checkpoint
正在直接保存到磁盘。如果内存已满(无论是您自己还是其他人,如果他们在同一个集群上工作),cache
和 persist
可以被覆盖,如果您的集群被占用,则它们将被清除。终止或重新启动。 checkpoint
将持久保存到 HDFS 或本地存储,并且仅在手动完成时才会被删除。每个都有不同的目的。
更多详细信息(强烈推荐阅读):
https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/6-CacheAndCheckpoint.md
在Does doing localCheckpoint.cache or cache.localCheckpoint do anything ? Or one or the other is enough ?
检查点
之前缓存
。 checkpoint
在它自己的作业上运行,因此如果 RDD 被缓存,它将从缓存中提取而不是重新运行它。
关于scala - 缓存与 localCheckpoint 以及如何阻止 Spark 删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52651282/