如何解决:java.lang.OutOfMemoryError:flink kafka使用者中的直接缓冲存储器

时间:2019-04-28 13:15:05

标签: apache-kafka apache-flink kafka-consumer-api flink-streaming

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

每个任务管理器都以10Gb的内存运行,并且任务管理器的堆大小限制为2Gb。 接收负载相当小(每秒100-200 msgs),平均邮件大小为〜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 个答案:

答案 0 :(得分:0)

您可能会低估的一件事是,并行度为5,表示有5 + 4 + 3 + 2 + 1 = 18对组合。如果将其与链接线程进行比较,则可能有3 + 2 + 1 = 6个组合。

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

(我不确定需求是否按照这种方式制定,但是唯一值得注意的区别是并行度从3到5,这似乎是补偿的好点)。