首页 文章

Kafka - Docker - 从主机向容器发送消息时出错(批量过期)

提问于
浏览
9

我很难排除故障,应该是一个简单的kafka问题 .

我正试图从 kafak-console-producer 发布一些消息 . 当我输入'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 ...

我按照quick-start中描述的方式运行kafka服务器

我可以创建主题并描述它 .

一个可能很重要的注意事项是kafka和zookeeper在docker-container中运行( 172.17.0.21 )我正在创建主题并从主机发送消息 .


请注意,(kafka-server)9092和(zk)2181都是开放的,可以从主机访问,我已经使用netstat和telnet确认了这一点 .

3 回答

  • 2

    原来是更多的Docker问题......

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

    我的主机无法使用主机名解析与docker-container的连接 .

    由于我已将端口映射到主机,因此我将kafak-server config的 advertised.host.name 更改为指向主机的IP地址 .

    这样一旦每次查询zk我的主机的IP地址被返回,然后通过端口转发我连接到docker中的代理 .

  • 13

    我正在尝试使用docker中的kafka 0.10.0.0并在下面找到

    advertised.host.name DEPRECATED:仅在advertised.listeners或侦听器未设置时使用 . 请改用advertised.listeners . 要发布到ZooKeeper以供客户端使用的主机名 . 在IaaS环境中,这可能需要与代理绑定的接口不同 . 如果未设置,则将使用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 的原因 .
    如你所见,那个_1237584的图像 . 虽然上次我检查时没有 v0.9 ,但是将 Dockerfile 分叉并调整为 0.9 是微不足道的 .

相关问题