yaa*_*rix 7 apache-kafka kafka-consumer-api apache-flink flink-streaming
我们正在 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)
Run Code Online (Sandbox Code Playgroud)
flink 重新启动作业,但它一直在该异常上失败。我们已经尝试按照此处的建议减少记录轮询: Kafka Consumers throwing java.lang.OutOfMemoryError: Direct buffer memory 我们还尝试按照此处的建议增加 kafka 堆大小: Flink + Kafka, java.lang.OutOfMemoryError when parallelism > 1,尽管我无法理解在 flink 进程中分配内存失败与 kafka 代理进程的 jvm 内存有什么关系,而且我在代理日志中没有看到任何指示 oom 的内容。
失败的原因可能是什么?我们还应该检查什么?
谢谢!
您可能低估的一件事是,并行度为 5,意味着有 5+4+3+2+1=18 对组合。如果我们将其与链接的线程进行比较,可能有 3+2+1=6 种组合。
在链接的线程中,通过将最大轮询记录设置为 250 来解决问题,因此我的第一个想法是将其设置为 80(甚至 10),看看是否可以解决问题。
(我不确定需求是否是这样形成的,但唯一明显的区别是从 3 到 5 的并行性,因此这似乎是一个需要弥补的好点)。
| 归档时间: |
|
| 查看次数: |
2394 次 |
| 最近记录: |