4

Ich habe Probleme beim Verbinden von meinem Host (Windows) zu Gast (Linux), wo ich Kafka installiert habe.Verbinden mit Kafka in VirtualBox

Ich habe eine VM (mit VirtualBox) eingerichtet, wo ich Confluent-Tools installiert habe. In dieser VM betreibe ich den Befehl:

confluent start schema-registry 

Es beginnt zookeeper, kafka, und Schema-Registrierung.

Unter dieser VM kann ich

kafka-console-producer --broker-list localhost:9092 --topic test 

und

kafka-console-consumer --bootstrap-server localhost:9092 --topic test 

und alles funktioniert gut, kann ich produzieren und Empfangen von Nachrichten laufen.

Mein Ziel ist es jedoch in der Lage sein, zu produzieren und konsumieren Nachrichten von meinem Rechner, so dass ich Setup dieser Port-Weiterleitungsregel: port forwarding rule

Von meinem Fenster, ich diesen Befehl Arbeit erwartet wurde:

bin\windows\kafka-console-producer.bat --broker-list 127.0.0.1:9092 --topic test 

aber alles, was ich bekommen, ist dies:

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 

ich viele verschiedene Sachen ausprobiert habe aber noch keine Lösung finden können .... ein y Ideen?

Antwort

3

Es scheint eine Hostnamenlücke zwischen Gast und Host zu sein. Welchen Hostnamen hat der Linux Guest?

Wenn der Producer/Consumer auf den Kafka-Broker zugreift, gibt der Kafka-Broker seinen Hostnamen für den Datenproduzenten oder -verbraucher bei den Standardeinstellungen zurück. Hersteller/Verbraucher müssen daher den Hostnamen des Brokers auf IPAddress auflösen.

Verwenden Sie für Broker, die einen beliebigen Hostnamen zurückgeben, die Einstellungen advertised.listeners.

Details sind in the "advertised.listeners" configuration docs.

+0

Vielen Dank für Ihre Hilfe, ich fühle mich wirklich verloren hier. Der Hostname des Linux Guest ist kafka-VirtualBox. In dem advertised.listeners, habe ich jetzt diesen: advertised.listeners = KLARTEXT: // kafka-VirtualBox: 9092 Und in dem Windows-Host, habe ich diese Zeile in dem Hosts-Datei: 127.0.0.1 kafka -VirtualBox Ich habe immer noch den gleichen Fehler obwohl ... – Florian

+0

Hmm ... Dann muss es Schritt für Schritt auflösen. Zuerst bestätigen, "Sind kafka-Befehle aktiviert, um auf kafka-VirtualBox zuzugreifen?" von kafka-topics.bat. – kimutansk

+0

habe ich auf dem Weg gepostet. Dann muss es Schritt für Schritt auflösen. Zuerst bestätigen Sie "Sind kafka-Befehle aktiviert, um auf kafka-VirtualBox zuzugreifen?" von kafka-broker-api-versions.bat. Wenn Befehle nicht auf kafka-VirtualBox zugreifen können, ist dieses Problem ein Problem mit den Netzwerkeinstellungen der virtuellen Box. Wenn Befehle auf kafka-VirtualBox zugreifen können, wird dieses Problem zum Problem der kafka-Broker- oder Client-Einstellungen. – kimutansk

0

Ich habe versucht, etwas Ähnliches einzurichten. Obwohl es wahrscheinlich besser ist, für Kafka und Zookeeper geeignete virtuelle Netzwerke einzurichten, habe ich weitergemacht und möchte meinen persönlichen Ansatz teilen.

Ich kann mit Kafka und Zookeeper arbeiten, die auf dem VirtualBox Linux-Gast laufen, sowie mit einer Docker-basierten Lösung, die auf diesem Linux-Gast läuft. Hier ist die docker-compose.yml ich im Gast verwendet:

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 

Der Kernpunkt ist hier die KAFKA_ADVERTISED_HOST_NAME, das macht einen schmutzigen kleinen Trick, die gut mit dem Standard spielt NAT-basierte Netzwerke in VirtualBox (vorausgesetzt, Sie 2181 gepatcht haben und 9092 durch wie OP tat). Mit diesem Trick wird jeder Verbraucher oder Produzent auf der VirtualBox Host OS von Kafka lernen, dass es sich auf "localhost" befindet, die auf Host aufgelöst wird, aber weil der Port auf dem Host durch die Gastdinge gepatcht wird, enden in der richtige Ort.

Der richtige Weg, um das Gleiche in 1.x zu tun, ist die Verwendung der Inserted Listeners Eigenschaften, aber das Prinzip bleibt gleich.


Als Referenz hier ist meine VirtualBox Einstellungen:

port 9092 and 2181 forwarded

Mit diesen Einstellungen nach docker-compose up auf dem Gast-Betriebssystem, konnte ich Themen auflisten/erstellen und konsumieren/produzieren Nachrichten vom Host-Betriebssystem .

Verwandte Themen