Spark 驱动程序吊舱因“OOMKilled”状态而被杀死

Nab*_*Nab 7 out-of-memory apache-spark spark-streaming kubernetes

我们正在使用 spark 2.4.5 在 Kubernetes 集群上运行 Spark Streaming 应用程序。该应用程序通过 Kafka 主题接收大量数据(每 3 毫秒一条消息)。正在使用 4 个执行程序和 4 个 kafka 分区。

在运行时,驱动程序 Pod 的内存不断增加,直到它被 K8s 以“OOMKilled”状态杀死。执行者的记忆没有面临任何问题。

使用此命令检查驱动程序 pod 资源时:

kubectl top pod podName
Run Code Online (Sandbox Code Playgroud)

我们可以看到内存增加到 1.4GB,并且 pod 被杀死。

但是,在 Spark UI 上查看驱动程序的存储内存时,我们可以看到存储内存未完全使用(50.3 KB / 434 MB)。驱动程序存储内存包含驱动程序的 pod内存有什么区别吗?

有没有人有过类似问题的经验?

任何帮助,将不胜感激。

以下是有关该应用程序的更多详细信息:

  • Kubernetes 版本:1.18
  • 火花版本:2.4.5
  • Spark 流上下文的批处理间隔:5 秒
  • 输入数据速率:每 3 毫秒 1 条 kafka 消息
  • 斯卡拉语言

Hun*_*ger 4

简单来说,Spark内存由三部分组成:

  • 反转内存(300MB)
  • 用户内存((全部 - 300MB)*0.4),用于数据处理逻辑。
  • Spark内存((all-300MB)*0.6( spark.memory.fraction)),用于Spark中的缓存和shuffle。

除此之外,K8s 中还有非JVM 内存使用的额外内存max(executor memory * 0.1, 384MB)0.1spark.kubernetes.memoryOverheadFactor

在 K8S 中通过内存开销添加执行程序内存限制应该可以修复 OOM。

您还可以减少spark.memory.fraction分配更多 RAM 给用户内存。