【发布时间】:2018-11-10 08:44:56
【问题描述】:
我一直在开发一个基于 java kafka-streams API 的应用程序,其目标是处理来自一个 kafka 主题的数据流,并将其生成到另一个主题中。
看起来,每当我开始使用 kafka-streams 应用程序生成消息时,文件句柄都会在我正在使用的 kafka 代理上保持打开状态,并且它们永远不会关闭,这意味着最终 kafka 服务器会打开太多文件,然后 kafka 和 zookeeper 守护进程崩溃。
我使用kafka-streams-1.0.1 API jar for Java,并在 JDK 11 上运行。kafka 集群是 Kafka 版本 1.0.0。
我的应用程序的配置包括以下 kafka 生产者配置:
-
batch.size:设置为 100,000 条消息。 -
linger.ms:设置为 1000 毫秒。 -
buffer.memory:设置为相当于 5 兆字节的字节。
流处理本身很简单,组成:
stream.map((k,v) -> handle(k,v)).filter((k,v) -> v != null).to(outgoingTopic);
如果你们有任何建议,我将不胜感激。
【问题讨论】:
-
Confluent 的建议是将主机的内核配置为允许 100.000+ 个打开的文件句柄。通常默认值远低于此值。
-
并且配置到那个级别。尽管如此,文件仍在继续打开
-
我认为 Java 11 没有得到 Kafka 社区的官方支持,也没有经过官方测试。不过不知道是不是这个问题
-
Java 11 用作我自己的应用程序的运行时,不应影响 Kafka 服务器上发生的事情
-
看来您对 kafka 流的使用非常简单。我建议使用更新版本的 Kafka,看看是否能解决问题。 2.0.0 已经发布几个月了,2.1.0 即将发布,可能在接下来的几周内。
标签: java apache-kafka apache-kafka-streams