我知道localCheckpoint
删除了重建RDD所需的历史记录。并且cache
正在保存RDD的当前状态,因此不需要重建它。
但是,我在某些方面感到困惑。如果我做了localCheckpoint
,并且稍后在我的代码中需要此RDD,我通常会得到一个Exception
,关于如何不再找到该分区。
我查看了sparkUI中的Storage
标签,它说保存的RDD仅占一小部分,例如17%。
因此,我读了更多的书,意识到火花会丢弃旧的RDD。 Spark有办法永久保留它吗?
此外,如果我不是用cache
而是用localCheckpoint
,是否可以解决问题?但是这将花费一些时间,因为Spark将不得不重新计算分区?
总体而言,我只想将RDD保留在我的工作的很大一部分中,以便能够在最后将其合并回去,但是到我到达那里时,Spark已将其删除。我该如何解决?
做localCheckpoint.cache
或cache.localCheckpoint
有什么作用吗?或一个就足够了吗?
答案 0 :(得分:0)
您是否有必要使用localCheckpoint
和checkpoint
?在使用localCheckpoint
时,您的无用复制被截断了,虽然速度更快但可靠性低得多,这可能是您遇到麻烦的地方。
保存位置的一般差异:
cache
正在保存到内存(如果将其大到将mem存储到磁盘),则checkpoint
直接保存到磁盘。如果内存已满(您自己或其他人在同一集群上工作),cache
和persist
可能会被覆盖,并且如果集群终止或重新启动,则会被清除。 checkpoint
将保留在HDFS或本地存储中,并且只有在手动完成后才会被删除。每个都有不同的目的。
更多详细信息(强烈建议阅读):
https://github.com/JerryLead/SparkInternals/blob/master/markdown/english/6-CacheAndCheckpoint.md
执行localCheckpoint.cache或cache.localCheckpoint可以做什么吗?或一个就足够了吗?
cache
,然后再checkpoint
。 checkpoint
自行运行,因此如果缓存了RDD,它将从缓存中提取而不是重新运行它。
答案 1 :(得分:0)
如果您想在工作的大部分时间内将spark.dynamicAllocation.cachedExecutorIdleTimeout
保留在内存中,请将RDD
设置为较高的值。