【问题标题】:Kafka streams.allMetadata() returns empty list in DOCKER (interactive queries)Kafka streams.allMetadata() 在 DOCKER 中返回空列表(交互式查询)
【发布时间】:2018-07-18 08:58:00
【问题描述】:

我有一个简单的 kafka 流应用程序,它利用交互式查询并使用 RESTfull 进行实例通信。

该应用程序在具有多个流实例的 docker 之外运行良好。并且流#allMetadata() 返回所有正在运行的实例的正确列表。但是,一旦我在 docker 中运行应用程序,streams#allMetadata() 的结果就是一个空数组 []。

注意:在 docker 中运行时,除了其他实例的可发现性之外,一切正常。 [我可以与不同的流实例进行交互,并且可以获取它们存储的数据]

我已经在这里查看过同样问题的其他帖子,但我的似乎有点不同other posts

  • 我在所有实例中都有相同的APPLICATION_ID
  • Kafka 与任何单个实例之间的通信正常。并且 Streams 工作正常 [意思是 BOOTSTRAP_SERVERS_CONFIG 配置正确]
  • 数据在所有实例上都正确存储,我可以通过其 IP 直接与每个实例交互[意思是 APPLICATION_SERVER_CONFIG 在每个实例上都正确配置]
  • 我正在运行相同版本的 Kafka 和 Streams v1.1.0。
  • 我尝试了 confluent 和landoop Kafka docker 图像,结果相同。

我在这里错过了什么?

【问题讨论】:

  • 您是否仔细检查了实际分配?应用程序在 docker 中运行时是否处理数据?我对问题可能是什么感到有点困惑。
  • 我们正在使用一个 dockerized 流应用程序,所以这是肯定的。需要检查几件事:APPLICATION_SERVER_CONFIG 中配置的端口是否由同一端口上的 docker 对外暴露?是否存在多个流应用在同一主机上的不同容器中运行的情况?
  • @MatthiasJ.Sax :是的,我确实检查了分区分配,我的分区分配正确,我可以看到在 Kafka 中使用正确的数据 [聚合] 创建了流内部主题。这就是为什么我很困惑。顺便说一句,我找到了根本原因问题并在下面发布了解决方案。
  • @KyleFransham:是的,我确保端口分配正确,我能够正确地与每个单独的实例进行交互。所以这不是端口配置问题。顺便一提。我找到了根本原因并在下面发布了解决方案。

标签: docker apache-kafka apache-kafka-streams


【解决方案1】:

我发现了问题并解决了。

问题是由于我的流应用程序 docker 基础映像中缺少库 [ld-linux-x86-64.so.2] 引起的,该库由 RocksDB 的一个依赖项 [librocksdbjni8077190960714261011.so] 使用(看图!)。

解决方案是只使用具有上述库的另一个基本映像,因此我将流媒体应用的基本映像从 openjdk:8-jdk-alpine 更改为 anapsix/alpine-java:latest,现在一切正常。

注意:当我遇到上述问题时,我注意到了另一种症状。我的流媒体应用偶尔会失去与 kafka 代理的连接。我会时不时地在日志上看到一条关于“无法到达代理节点......”的消息。此问题在上述修复后消失。我不知道它们是如何关联的。

【讨论】:

  • 太好了,你想通了。我仍然想知道错误的基本图像与问题的联系是什么?所有线程是否由于缺少库而死亡,因此在分区分配发生后元数据为空?如果是,您是否通过日志发现了这一点?
  • @MatthiasJ.Sax:没错,任务分配最初发生,但随后任务将关闭,我最终得到空的元数据。有时日志只会为每个任务显示Invalid transition attempted from state READY to state ABORTING_TRANSACTION。但这又是零星的。
猜你喜欢
  • 2018-02-13
  • 2021-01-24
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多