Apache spark 当缓存(仅限内存的持久性)数据不适合内存时,spark如何处理内存不足错误?

Apache spark 当缓存(仅限内存的持久性)数据不适合内存时,spark如何处理内存不足错误?,apache-spark,caching,out-of-memory,rdd,partitioning,Apache Spark,Caching,Out Of Memory,Rdd,Partitioning,我是spark的新手,我无法找到明确的答案,即当缓存的数据不适合内存时会发生什么 在很多地方,我发现如果RDD不适合内存,一些分区将不会被缓存,并且会在每次需要时被动态重新计算 例如:假设创建了500个分区,假设200个分区没有缓存,那么我们必须通过重新计算RDD来重新计算剩余的200个分区 如果是这种情况,那么OOM错误永远不会发生,但它确实发生了。原因是什么 非常感谢您的详细解释。请提前感谢您可以通过多种方式在spark中持久化数据帧 1) 持久化(仅限内存) 当您仅使用内存_持久化数据帧时

我是spark的新手,我无法找到明确的答案,即当缓存的数据不适合内存时会发生什么

在很多地方,我发现如果RDD不适合内存,一些分区将不会被缓存,并且会在每次需要时被动态重新计算

例如:假设创建了500个分区,假设200个分区没有缓存,那么我们必须通过重新计算RDD来重新计算剩余的200个分区

如果是这种情况,那么OOM错误永远不会发生,但它确实发生了。原因是什么


非常感谢您的详细解释。请提前感谢

您可以通过多种方式在spark中持久化数据帧

1) 持久化(仅限内存)

当您仅使用内存_持久化数据帧时,它将作为反序列化的Java对象缓存在spark.cached.MEMORY节中。如果RDD不适合内存,则某些分区将不会被缓存,并且会在每次需要时动态重新计算。这是默认级别,当RDD太大且无法放入内存时,有时会导致OOM(也可能在重新计算后发生)

回答你的问题

如果是这种情况,那么OOM错误永远不会发生,但它确实发生了。原因是什么? 即使在重新计算之后,您也需要将这些rdd放入内存中。如果没有可用空间,那么GC将尝试清理某些部分并尝试分配它。如果不成功,那么它将失败,并返回OOM


2) 持久化(内存和磁盘)

当您使用内存和磁盘持久化数据帧时,它将作为反序列化的Java对象缓存在spark.cached.MEMORY部分。如果堆中没有可用的内存,那么它将溢出到磁盘。为了解决内存问题,它会将部分数据或完整数据溢出到磁盘。(注意:确保节点中有足够的磁盘空间,否则不会弹出磁盘空间错误)


3) 持久化(仅限内存) 当您仅使用内存保存数据帧时,它将作为序列化Java对象(每个分区一个字节数组)缓存在spark.cached.MEMORY节中。这通常比仅使用内存更节省空间,但这是一项cpu密集型任务,因为涉及压缩(这里的一般建议是使用Kyro进行序列化),但这仍然面临类似于仅使用内存的OOM问题


4) 持久化(内存和磁盘) 它与MEMORY_ONLY_SER类似,但一个区别是当没有可用的堆空间时,它会将RDD数组溢出到磁盘,与(MEMORY_AND_disk)…相同。。。当您的磁盘空间受到严格限制并且希望减少IO流量时,我们可以使用此选项


5) 持久化(仅磁盘) 在这种情况下,不使用堆内存。RDD被持久化到磁盘。确保有足够的磁盘空间,此选项将有巨大的IO开销。当您有重复使用的数据帧时,不要使用此选项


6) 持久化(仅内存\u 2或内存\u和磁盘\u 2) 这些类似于上面提到的“仅内存”和“内存”和“磁盘”。唯一的区别是这些选项复制两个集群节点上的每个分区只是为了安全起见。。使用spot实例时,请使用这些选项


7) 持久化(离开堆)
堆外内存通常包含线程堆栈、spark容器应用程序代码、网络IO缓冲区和其他操作系统应用程序缓冲区。甚至您也可以利用RAM中的这部分内存,使用上述选项缓存RDD。

感谢您详细解释持久化(仅限内存)。