如何修复:java.lang.OutOfMemoryError: Direct buffer memory in flink kafka consumer

Posted

技术标签:

【中文标题】如何修复:java.lang.OutOfMemoryError: Direct buffer memory in flink kafka consumer【英文标题】:How to fix: java.lang.OutOfMemoryError: Direct buffer memory in flink kafka consumer 【发布时间】:2019-09-17 07:49:50 【问题描述】:

我们在 kubernetes 上运行一个 5 节点的 flink 集群(1.6.3),带有 5 个分区的 Kafka 主题源。 5 个作业正在读取该主题(具有不同的消费者组),每个作业的并行度 = 5。

每个任务管理器都使用 10Gb 的内存运行,并且任务管理器堆大小限制为 2Gb。 摄取负载相当小(每秒 100-200 条消息),平均消息大小约为 4-8kb。 所有工作都运行良好几个小时。一段时间后,我们突然看到一个或多个作业失败:

ava.lang.OutOfMemoryError: Direct buffer memory
    at java.nio.Bits.reserveMemory(Bits.java:666)
    at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
    at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
    at sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:241)
    at sun.nio.ch.IOUtil.read(IOUtil.java:195)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at org.apache.kafka.common.network.PlaintextTransportLayer.read(PlaintextTransportLayer.java:110)
    at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:97)
    at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:71)
    at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:169)
    at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:150)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:355)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:303)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:349)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:226)
    at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1047)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:995)
    at org.apache.flink.streaming.connectors.kafka.internal.KafkaConsumerThread.run(KafkaConsumerThread.java:257)

flink 重新启动作业,但在该异常上一直失败。 我们已尝试按照此处的建议减少记录民意调查: Kafka Consumers throwing java.lang.OutOfMemoryError: Direct buffer memory 我们还尝试按照此处的建议增加 kafka 堆大小: Flink + Kafka, java.lang.OutOfMemoryError when parallelism > 1,虽然我无法理解在 flink 进程中分配内存失败与 kafka 代理进程的 jvm 内存有什么关系,而且我在代理日志中看不到任何指示 oom 的内容。

失败的原因可能是什么?我们还应该检查什么?

谢谢!

【问题讨论】:

【参考方案1】:

您可能低估的一件事是,并行度为 5,意味着有 5+4+3+2+1=18 对组合。如果我们将此与链接的线程进行比较,则可能有 3+2+1=6 种组合。

在链接的线程中,通过将最大轮询记录设置为 250 来解决问题,因此我的第一个想法是在此处将其设置为 80(甚至设置为 10),看看是否可以解决问题。

(我不确定需求是否以这种方式形成,但唯一明显的区别是从 3 到 5 的并行度,因此这似乎是一个很好的补偿点)。

【讨论】:

以上是关于如何修复:java.lang.OutOfMemoryError: Direct buffer memory in flink kafka consumer的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 npm 审计修复问题?

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)