apache-spark - Spark 驱动程序 pod 被杀死,状态为 'OOMKilled'

标签 apache-spark kubernetes out-of-memory spark-streaming

我们正在使用 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 的内存 ?
有没有人有过类似问题的经验?
任何帮助,将不胜感激。
以下是有关该应用程序的更多详细信息:
  • Kubernetes 版本:1.18
  • Spark 版本:2.4.5
  • Spark 流上下文的批处理间隔:5 秒
  • 输入数据速率:1 条 kafka 消息,每 3 毫秒
  • Scala 语言
  • 最佳答案

    简而言之,执行器内存由三部分组成:

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

  • 除此之外,还有max(executor memory * 0.1, 384MB) ( 0.1spark.kubernetes.memoryOverheadFactor )K8s 中非 JVM 内存使用的额外内存。
    在 K8S 中通过内存开销添加执行器内存限制应该可以解决 OOM。
    您也可以减少spark.memory.fraction为用户内存分配更多 RAM。

    关于apache-spark - Spark 驱动程序 pod 被杀死,状态为 'OOMKilled',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63412368/

    相关文章:

    scala - value < 不是 AnyVal 的成员

    apache-spark - Apache Spark : Dag is not executed twice for reduceByKey

    docker - K8s SQL2019 HA 容器 - 老兄,我的 Pod 在哪里?

    r - 将非平凡函数应用于 data.table 的有序子集

    c++ - C 应用程序中的访问冲突

    Python 给出内存错误

    java - 无法在 docker 上的 spark 集群上提交 spark 作业

    apache-spark - spark中如何区分操作是转换还是 Action ?

    ssh - 如何通过 ssh 连接到 Google 计算引擎磁盘?

    kubernetes - 路线在 kubernetes 中无法使用 calico 工作