我明白 localCheckpoint
删除重建rdd所需的历史记录。以及 cache
正在保存rdd的当前状态,因此不需要重建它。
然而,我在几个方面感到困惑。如果我这样做了 localCheckpoint
,我需要这个rdd在以后的代码中,我经常得到一个 Exception
关于如何再也找不到分区。
我看了看 Storage
它说只有一小部分rdd被保存了下来,比如17%。
所以我读了更多的书,意识到spark会抛弃旧的RDD。spark有没有办法永远保持它?
另外,如果我在做 cache
而不是 localCheckpoint
,问题解决了吗?但这需要时间,因为spark需要重新计算分区?
总的来说,我只想在内存中保留一个rdd,以便在工作的很大一部分能够在最后将它合并回来,但当我到达那里时,spark已经删除了它。我该怎么解决这个问题?
做什么 localCheckpoint.cache
或者 cache.localCheckpoint
有什么事吗?或者一个就够了?
2条答案
按热度按时间jq6vz3qz1#
套
spark.dynamicAllocation.cachedExecutorIdleTimeout
如果你想保持RDD
在你工作的很长一段时间里。xtfmy6hx2#
你需要使用
localCheckpoint
与checkpoint
? 当使用localCheckpoint
你的截短w/o复制,这是更快,但更不可靠,这可能是你的麻烦。保存位置的一般差异:
cache
正在保存到内存(如果对于内存到磁盘来说是大的),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,它将从缓存中提取而不是重新运行它。