运行Apache Flink作业时,K8s群集内存减少

时间:2020-07-03 20:25:16

标签: kubernetes apache-flink flink-streaming

我们正在尝试在K8s集群上部署apache Flink作业,但是我们注意到一种奇怪的行为,当我们开始工作时,任务管理器的内存以分配的容量开始,在本例中为3 GB。

taskmanager.memory.process.size: 3g

最终,内存开始减少,直到达到约160 MB,这时,它恢复了一点内存,因此没有用完。

Image 1

Image 2

即使尝试在Flink仪表板上查看日志或执行作业的过程,由于内存不足,通常也会由于任务管理器检测信号异常而导致作业终止。

为什么它的内存如此之少?我们希望有这种行为,但是在GB范围内,因为即使更改了任务管理器的内存大小,我们也将这3Gb分配给了任务管理器。

我们的Flink conf看起来像这样:

flink-conf.yaml: |+
taskmanager.numberOfTaskSlots: 1
    blob.server.port: 6124
    taskmanager.rpc.port: 6122
    taskmanager.memory.process.size: 3g
    metrics.reporters: prom
    metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter
    metrics.reporter.prom.port: 9999
    metrics.system-resource: true
    metrics.system-resource-probing-interval: 5000
    jobmanager.rpc.address: flink-jobmanager
    jobmanager.rpc.port: 6123

在K8上是否有用于内存的推荐配置,或者我们在flink-conf.yml中缺少的配置?

谢谢。

2 个答案:

答案 0 :(得分:0)

您的配置看起来不错。这很可能是您的代码存在问题以及某种内存泄漏。 This is a very good answer describing what may be the problem

您可以尝试使用taskmanager.memory.task.heap.size设置JVM堆的限制,以便为JVM提供一些额外的空间来进行GC等操作。但是最后,如果分配的是未被引用的内容,您将碰到这种情况。

假定您正在使用memory to store your state,在这种情况下,如果要存储大对象,也可以尝试将RockDB用作state backend

答案 1 :(得分:0)

您在部署模板中的要求/限制是什么?如果没有指定请求大小,您可能会看到集群资源被吃掉。