卡夫卡经纪人在一段时间后失败了

kafka broker became failed after some time

我们有带有 ambari GUI 的 hadoop 集群版本 2.6.4 在我们的集群中,我们有 3 台 kafka 机器,它们是独立机器,而 3 台 zookeper 服务器安装在其他机器上 - master01/02/03

其中一台 kafka 机器出现了一个奇怪的问题,而其他 kafka 机器没有这个问题

问题是 - 当我们在几分钟后启动 kafka 代理时,它出现故障

这是日志:

来自 kafka.err

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ThrottledRequestReaper-Fetch"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ExpirationReaper-1002"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "kafka-network-thread-1002-PLAINTEXT-2"
Exception in thread "ExpirationReaper-1002" Exception in thread "ExpirationReaper-1002" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "ExpirationReaper-1002"
Exception in thread "metrics-meter-tick-thread-2" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-3" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-4" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-5" java.lang.OutOfMemoryError: Java heap space

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main-SendThread(master02.sys87.com:2181)"
Exception in thread "metrics-meter-tick-thread-6" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-1" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-7" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-9" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-10" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-11" java.lang.OutOfMemoryError: Java heap space
Exception in thread "metrics-meter-tick-thread-1" java.lang.OutOfMemoryError: Java heap space

从日志的读取来看,看起来这是 - "heap space allocated" 在 kafka 机器上

任何建议解决这个问题的方法是什么?

我们如何解释这个问题出现在其中一台 kafka 机器上,而另外两台我们没有这个问题?符合逻辑吗?

你有一个OutOfMemoryError,这意味着在某个时候Kafka实例需要分配更多内存,发现没有可用的物理内存或者它达到了JVM中设置的限制(注意Kafka是写在Java/Scala,因此在 运行s in a JVM) 选项中,调用垃圾收集器来释放一些内存,但无法释放足够的内存。

为什么会发生?有多种可能的原因。

  • Kafka 代码中的一个错误,阻止释放未使用的内存

  • 当前机器无法处理的大量负载

  • 使用或配置不当。例如,您设置了一个流,连接到它,但不读取。或者读得太慢。待办事项不断增加,直到填满你的整个记忆

  • Kafka 实例的内存限额太严格。让它在 bash export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" 中占用更多内存 运行 (尝试找到一个工作值)。此处有更多详细信息:

  • JVM optionscgroups 配置之间存在冲突。例如。您设置了 -Xmx2G 但 cgoups 中只有 1G (memory.limit_in_bytes).

  • Using/configuring docker(使用 lxc,使用 cgroups)或其他 virtualization/containerization 工具不正确。或者甚至正确 - 我听说 JVM 选项和 cgroups 限制之间存在一些误解,这些限制仅在 Java.

    的 beta 版本中得到修复

    这不是完整列表,而是探索问题所在的开始。

编辑
如果您在代理的配置和行为中没有发现明显的缺陷,您可以在崩溃时分析进程转储以查看所有内存去了哪里。为此,将 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=... 添加到 JVM 选项。然后你可以将这个转储加载到像 HeapWalker 这样的分析器中,并寻找异常大的 number/size 对象。