我在从主机(windows)连接到安装了kafka的guest(linux)时遇到问题。
我已经建立了一个vm(带有virtualbox),在那里我安装了合流工具。在这个虚拟机中,我运行以下命令:
confluent start schema-registry
它启动zookeeper、kafka和schema registry。
在这个虚拟机下,我可以运行
kafka-console-producer --broker-list localhost:9092 --topic test
和
kafka-console-consumer --bootstrap-server localhost:9092 --topic test
一切正常,我可以产生和接收信息。
但是,我的目标是能够生成和使用来自主机的消息,因此我设置了以下端口转发规则:
在我的windows中,我希望此命令可以工作:
bin\windows\kafka-console-producer.bat --broker-list 127.0.0.1:9092 --topic test
但我得到的是:
ERROR Error when sending message to topic test with key: null, value: 3 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for test-0: 1529 ms has passed since batch creation plus linger time
我试过很多不同的方法,但还是找不到解决办法。。。。有什么想法吗?
2条答案
按热度按时间z2acfund1#
这似乎是客人和主人之间的主机名差距。linux客户机有什么主机名?
当生产者/消费者访问kafka代理时,kafka代理将以默认设置返回其数据生产者或消费者的主机名。所以生产者/消费者需要将代理的主机名解析为ipaddress。
对于返回任意主机名的代理,请使用
advertised.listeners
设置。详细信息请参见“adverted.listeners”配置文档。
nhaq1z212#
我想做点类似的事情。尽管为Kafka和zookeeper建立适当的虚拟网络可能更好,但我还是继续努力,并想分享我的个人做法。
我有一些东西要和运行在virtualbox linux客户机上的kafka和zookeeper一起工作,还有一个运行在该linux客户机上的基于docker的解决方案。这是你的答案
docker-compose.yml
我在客人里面用过:关键在于
KAFKA_ADVERTISED_HOST_NAME
,这是一个肮脏的小把戏,可以很好地与virtualbox中默认的基于nat的网络配合使用(假设您已经打了补丁)2181
以及9092
通过行动)。通过这个技巧,virtualbox主机os上的任何消费者或生产者都将从kafka那里了解到它所在的位置"localhost"
,它解析为主机,但由于主机上的端口已通过补丁连接到访客,因此最终会出现在正确的位置。在1.x中执行相同操作的正确方法是使用播发的侦听器属性,但原理保持不变。
以下是我的virtualbox设置供参考:
有了这些设置之后
docker-compose up
在访客操作系统上,我可以列出/创建主题,并使用/生成来自主机操作系统的消息。