当缓存(MEMORY_ONLY持久性)数据不适合内存时,spark如何处理内存不足错误?
how spark handles out of memory error when cached( MEMORY_ONLY persistence) data does not fit in memory?
我是 spark 的新手,我无法找到当缓存数据不适合内存时会发生什么的明确答案?
很多地方我发现如果 RDD 不适合内存,一些分区将不会被缓存,并且会在每次需要时即时重新计算。
对于 example:lets 说创建了 500 个分区并且说没有缓存 200 个分区然后我们必须通过重新评估 RDD 来重新计算剩余的 200 个分区。
如果是这种情况,那么绝不会发生 OOM 错误,但 does.What 是原因吗?
详细说明提前高度appreciated.Thanks
您可以通过多种方式在 spark 中持久化数据框。
1)坚持(MEMORY_ONLY)
当您使用 MEMORY_ONLY 持久化数据帧时,它将作为反序列化的 Java 对象缓存在 spark.cached.memory 部分中。如果 RDD 不适合内存,一些分区将不会被缓存,并且会在每次需要时即时重新计算。这是默认级别,有时会在 RDD 太大且无法放入内存时导致 OOM(重新计算后也可能发生)。
回答你的问题
如果是这种情况,那么 OOM 错误应该永远不会发生,但它 does.What 是原因吗?
即使在重新计算之后,您也需要将这些 rdd 放入内存中。如果没有 space 可用,那么 GC 将尝试清理某些部分并尝试分配 it.if 不成功然后它会因 OOM
而失败
2)坚持(MEMORY_AND_DISK)
当您使用 MEMORY_AND_DISK 持久化数据帧时,如果堆中的内存不可用,它将作为反序列化的 Java 对象缓存在 spark.cached.memory 部分中,然后它将溢出到磁盘。为了解决内存问题,它会将部分数据或完整数据溢出到磁盘。 (注意:确保节点中有足够的磁盘 space 其他 no-disk space 错误将弹出)
3)坚持 (MEMORY_ONLY_SER)
当您使用 MEMORY_ONLY_SER 持久化数据帧时,它将作为序列化的 Java 对象(每个分区 one-byte 数组)缓存在 spark.cached.memory 部分中。这通常比 MEMORY_ONLY 多 space-efficient 但它是一个 cpu-intensive 任务,因为涉及压缩(这里一般建议是使用 Kyro 进行序列化)但这仍然面临类似于 MEMORY_ONLY.
4)坚持 (MEMORY_AND_DISK_SER)
它类似于 MEMORY_ONLY_SER 但一个区别是当没有堆 space 可用时它会将 RDD 数组溢出到磁盘,就像 (MEMORY_AND_DISK) 一样......我们可以使用这个选项当您对磁盘 space 有严格的限制并且您想减少 IO 流量时。
5)坚持(DISK_ONLY)
在这种情况下,堆内存不会 used.RDD 被持久化到磁盘。确保有足够的磁盘 space 并且此选项将产生巨大的 IO 开销。当你有重复使用的数据帧时不要使用它。
6)坚持(MEMORY_ONLY_2 或 MEMORY_AND_DISK_2)
这些类似于上面提到的 MEMORY_ONLY 和 MEMORY_AND_DISK。唯一的区别是这些选项将每个分区复制到两个集群节点上只是为了安全起见。在使用 spot 实例时使用这些选项。
7)坚持(OFF_HEAP)
堆外内存一般包含线程栈、spark容器应用程序代码、网络IO缓冲区和其他OS个应用程序缓冲区。即使您可以使用 RAM 中的这部分内存来缓存您的 RDD,也可以使用上述选项。
我是 spark 的新手,我无法找到当缓存数据不适合内存时会发生什么的明确答案?
很多地方我发现如果 RDD 不适合内存,一些分区将不会被缓存,并且会在每次需要时即时重新计算。
对于 example:lets 说创建了 500 个分区并且说没有缓存 200 个分区然后我们必须通过重新评估 RDD 来重新计算剩余的 200 个分区。
如果是这种情况,那么绝不会发生 OOM 错误,但 does.What 是原因吗?
详细说明提前高度appreciated.Thanks
您可以通过多种方式在 spark 中持久化数据框。
1)坚持(MEMORY_ONLY)
当您使用 MEMORY_ONLY 持久化数据帧时,它将作为反序列化的 Java 对象缓存在 spark.cached.memory 部分中。如果 RDD 不适合内存,一些分区将不会被缓存,并且会在每次需要时即时重新计算。这是默认级别,有时会在 RDD 太大且无法放入内存时导致 OOM(重新计算后也可能发生)。
回答你的问题
如果是这种情况,那么 OOM 错误应该永远不会发生,但它 does.What 是原因吗? 即使在重新计算之后,您也需要将这些 rdd 放入内存中。如果没有 space 可用,那么 GC 将尝试清理某些部分并尝试分配 it.if 不成功然后它会因 OOM
而失败2)坚持(MEMORY_AND_DISK)
当您使用 MEMORY_AND_DISK 持久化数据帧时,如果堆中的内存不可用,它将作为反序列化的 Java 对象缓存在 spark.cached.memory 部分中,然后它将溢出到磁盘。为了解决内存问题,它会将部分数据或完整数据溢出到磁盘。 (注意:确保节点中有足够的磁盘 space 其他 no-disk space 错误将弹出)
3)坚持 (MEMORY_ONLY_SER) 当您使用 MEMORY_ONLY_SER 持久化数据帧时,它将作为序列化的 Java 对象(每个分区 one-byte 数组)缓存在 spark.cached.memory 部分中。这通常比 MEMORY_ONLY 多 space-efficient 但它是一个 cpu-intensive 任务,因为涉及压缩(这里一般建议是使用 Kyro 进行序列化)但这仍然面临类似于 MEMORY_ONLY.
4)坚持 (MEMORY_AND_DISK_SER) 它类似于 MEMORY_ONLY_SER 但一个区别是当没有堆 space 可用时它会将 RDD 数组溢出到磁盘,就像 (MEMORY_AND_DISK) 一样......我们可以使用这个选项当您对磁盘 space 有严格的限制并且您想减少 IO 流量时。
5)坚持(DISK_ONLY) 在这种情况下,堆内存不会 used.RDD 被持久化到磁盘。确保有足够的磁盘 space 并且此选项将产生巨大的 IO 开销。当你有重复使用的数据帧时不要使用它。
6)坚持(MEMORY_ONLY_2 或 MEMORY_AND_DISK_2) 这些类似于上面提到的 MEMORY_ONLY 和 MEMORY_AND_DISK。唯一的区别是这些选项将每个分区复制到两个集群节点上只是为了安全起见。在使用 spot 实例时使用这些选项。
7)坚持(OFF_HEAP) 堆外内存一般包含线程栈、spark容器应用程序代码、网络IO缓冲区和其他OS个应用程序缓冲区。即使您可以使用 RAM 中的这部分内存来缓存您的 RDD,也可以使用上述选项。