我们正在使用 spark 2.4.5 在 Kubernetes 集群上运行 Spark Streaming 应用程序。
该应用程序通过 Kafka 主题接收大量数据(每 3 毫秒一条消息)。正在使用 4 个执行程序和 4 个 kafka 分区。
在运行时,驱动程序 Pod 的内存不断增加,直到它被 K8s 以“OOMKilled”状态杀死。执行者的内存没有面临任何问题。
使用此命令检查驱动程序 pod 资源时:
kubectl top pod podName
我们可以看到内存增加到 1.4GB,并且 pod 被杀死。但是,在 Spark UI 上检查驱动程序的存储内存时,我们可以看到存储内存未完全使用(50.3 KB/434 MB)。 有什么区别吗驱动程序存储内存 ,以及 包含驱动程序的 pod 的内存 ?
有没有人有过类似问题的经验?
任何帮助,将不胜感激。
以下是有关该应用程序的更多详细信息:
最佳答案
简而言之,执行器内存由三部分组成:
spark.memory.fraction
)),用于 Spark 中的缓存和 shuffle。 除此之外,还有
max(executor memory * 0.1, 384MB)
( 0.1
是 spark.kubernetes.memoryOverheadFactor
)K8s 中非 JVM 内存使用的额外内存。在 K8S 中通过内存开销添加执行器内存限制应该可以解决 OOM。
您也可以减少
spark.memory.fraction
为用户内存分配更多 RAM。
关于apache-spark - Spark 驱动程序 pod 被杀死,状态为 'OOMKilled',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63412368/