Kafka - Docker - 主机向容器发送消息时出现错误(批次已过期)

9

我在解决一个应该很简单的kafka问题时遇到了一些困难。

我正在尝试从 kafka控制台生产者 发布一些消息。当我键入 'hi' 时,出现以下错误:

/opt/kafka/bin/kafka-console-producer.sh --topic test --broker-list 172.17.0.21:9092
hi
[2016-01-25 12:56:19,839] ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Batch Expired (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

我似乎找不到任何kafka-log4j-logs...

我按照 快速入门 中所述的方式运行kafka服务器。

我可以创建主题并进行描述。

一个可能重要的注意事项是kafka和zookeeper在docker容器中运行(172.17.0.21),我从主机创建主题并发送消息。


请注意,(kafka-server) 9092 和 (zk) 2181 端口都开放且可从主机访问,我使用 netstat 和 telnet 进行了确认。


使用哪个版本的Kafka?运行公共Docker镜像还是自己构建的镜像?您正在使用什么“docker run”命令来启动容器?您是否更改了默认的Kafka配置?您是否在单独的容器中运行ZK? - Marko Bonaci
@MarkoBonaci - 这个问题让我很头疼,但我学到了几个宝贵的经验教训。这是我的自己的Docker镜像。已发布答案。 - hba
3个回答

13

结果证明这更像是一个Docker问题...

好的,在运行客户端 kafka-console-consumer.sh 时,我发现它正在尝试使用容器名称(GUID的前几个字符)连接代理。

我的主机无法通过主机名解析连接到docker-container。

由于我已经将端口映射到了我的主机上,因此我将kafka-server配置中的 advertised.host.name 更改为指向我的主机的IP地址。

这样,每当查询zk以获取代理时,都会返回我的主机的IP地址,然后通过端口转发就可以连接到docker中的代理。


是的,advertised.host.name 是我的最初想法(一个常见问题),但我想在提及它之前获取更多信息。 - Marko Bonaci
你在Docker容器中的kafka-server配置中更改了这个吗? - Jonathan

2

我正在尝试使用Docker中的Kafka 0.10.0.0版本,并发现以下提示:

advertised.host.name 已经被弃用:只有在未设置 advertised.listenerslisteners 的情况下才会使用。请改用 advertised.listeners。它是发布到ZooKeeper供客户端使用的主机名。在IaaS环境中,这可能需要与Broker绑定的接口不同。如果没有设置,将使用配置为 host.name 的值。否则,将使用从java.net.InetAddress.getCanonicalHostName()返回的值。

因此,设置 advertised.listeners=PLAINTEXT://yourhost:9092 即可解决问题。


1

顺便提一下,你知道可以通过docker run命令设置该变量吗?

例如,这就是我如何在单个容器中启动Kafka和ZK,用于我的本地开发环境:

docker run --name st-kafka -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=`docker-machine ip machine_name` -e ADVERTISED_PORT=9092 -d spotify/kafka

然后,创建一个主题:
docker exec -ti st-kafka bash -c "/opt/kafka_*/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic_name"

这是在OS X上的操作,所以我使用docker-machine ip MACHINE_NAME。 正如你所看到的,这是Spotify的镜像。虽然上次我检查时没有v0.9,但很容易复制Dockerfile并调整为0.9

谢谢。我自己构建了图像...我没有使用 Spotify。 - hba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接