我知道Apache Spark persist 方法会将RDD保存在内存中,并且,如果没有足够的内存空间,它将在文件系统中存储RDD的其余分区(磁盘)。我似乎无法理解的是以下内容:
想象一下,我们有一个集群,并且我们想保留一个RDD。假设节点A没有很多内存空间,而节点B拥有很多。现在让我们假设,在运行 persist 命令之后,节点A的内存不足。现在的问题是:
Apache Spark是否在节点B中搜索更多的内存空间并尝试将所有内容存储在内存中?
或者假设节点A中没有足够的空间,即使节点B中有一些可用的存储空间,Spark也会将RDD的其余分区存储在节点A的磁盘中?
感谢您的回答。
答案 0 :(得分:2)
通常,Spark不会搜索可用空间。数据在负责特定分区的执行程序上本地缓存。
唯一的例外是使用复制的持久性模式时-在这种情况下,其他副本将放置在另一个节点上。
答案 1 :(得分:1)
我能找到的最接近的东西是这个To cache or not to cache。在很多情况下,当数据略微偏斜并且尝试将缓存/持久存储到RAM时出现与内存相关的异常/故障时,一种解决方法是使用诸如 MEMORY_AND_DISK 之类的StorageLevel,但显然这正在占用缓存时间长于读取分区。
此外,在Spark UI中,您还可以找到有关执行程序以及它们用于缓存的内存量的信息,还可以进行实验并监视其行为。