Apache Spark 是在节点级还是集群级缓存 RDD?

Does Apache Spark cache RDD in node-level or cluster-level?

我知道 Apache Spark persist 方法将 RDD 保存在内存中,如果内存不足 space,它将 RDD 的剩余分区存储在文件系统(磁盘)中。我似乎无法理解的是以下内容:

假设我们有一个集群,我们想要持久化一个 RDD。假设节点 A 没有很多内存 space 而节点 B 有。现在假设在 运行 persist 命令之后,节点 A 内存不足。现在的问题是:

Apache Spark 是否在节点 B 中搜索更多内存 space 并尝试将所有内容存储在内存中?

或者假设节点A中没有足够的space,即使节点B中有一些可用内存space,Spark也会将RDD的剩余分区存储在节点A的磁盘中?

感谢您的回答。

通常 Spark 不会搜索免费 space。数据缓存在负责特定分区的执行程序本地。

唯一的例外是使用复制持久模式时的情况 - 在这种情况下,额外的副本将放置在另一个节点上。

我能找到的最接近的是这个 To cache or not to cache。当我尝试 cache/persist 进入 RAM 时,我遇到过很多数据轻微倾斜并且与内存相关的情况 exceptions/failures,解决它的一种方法是使用像 MEMORY_AND_DISK 这样的 StorageLevels ,但显然缓存和读取这些分区花费的时间更长。

此外,在 Spark UI 中,您还可以找到有关执行程序的信息以及它们有多少内存用于缓存,您可以试验和监控它的行为方式。