Reputation: 139
I'm having troubles connecting from my Host (Windows) to Guest (Linux) where I installed Kafka.
I have set up a VM (with VirtualBox) where I installed Confluent tools. In this VM, I run the command:
confluent start schema-registry
It starts zookeeper, kafka, and schema-registry.
Under this VM, I can run
kafka-console-producer --broker-list localhost:9092 --topic test
and
kafka-console-consumer --bootstrap-server localhost:9092 --topic test
and everything is working fine, I can produce and receive messages.
My goal is however to be able to produce and consume messages from my Host, so I setup this port forwarding rule :
From my Windows, I was expecting this command to work:
bin\windows\kafka-console-producer.bat --broker-list 127.0.0.1:9092 --topic test
But all I get is this :
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
I've tried many different stuff but still can't find a solution.... Any ideas?
Upvotes: 6
Views: 5431
Reputation: 63800
I was trying to set up something similar. Although it's probably better to set up proper virtual networks for Kafka and Zookeeper, I did push on and want to share my personal approach.
I've got things to work with Kafka and Zookeeper running on the VirtualBox Linux guest itself, as well as a docker-based solution running on that Linux guest. Here's the docker-compose.yml
I used inside the guest:
version: '3'
services:
zookeeper:
image: "wurstmeister/zookeeper"
ports:
- "2181:2181"
kafka:
image: "wurstmeister/kafka"
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: "localhost"
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
The crux here is the KAFKA_ADVERTISED_HOST_NAME
, which does a dirty little trick that plays well with the default NAT-based networking in VirtualBox (assuming you've patched 2181
and 9092
through as OP did). With this trick any consumer or producer on the VirtualBox Host OS will learn from Kafka that it is located on "localhost"
, which resolves to the Host, but because the port on the host is patched through to the guest things end up in the right place.
The proper way to do the same in 1.x is to use the Advertised Listeners properties, but the principle remains the same.
For reference, here's my VirtualBox settings:
With those settings, after docker-compose up
on the guest OS, I could list/create topics and consume/produce messages from the host OS.
Upvotes: 0
Reputation: 131
It seems to be a host name gap between Guest and Host. What host name does the Linux Guest have?
When producer/consumer accesses the Kafka broker, the Kafka broker returns its host name for data producer or consumer at default settings. So producers/consumers need to resolve broker's host name to IPAddress.
For broker returning an arbitrary host name, use the advertised.listeners
settings.
Details are in the "advertised.listeners" configuration docs.
Upvotes: 5