8

Wenn ich versuche, das Kafka Producer und Consumer (0.9.0) Skript zu verwenden, um Nachrichten von einem Thema zu pushen/ziehen, erhalte ich die folgenden Fehler.Kafka Consumer "konnte Leiter nicht finden" beim Abrufen von Thema Metadaten

Producer Fehler

[2016-01-13 02:49:40,078] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

Consumer Fehler

> [2016-01-13 02:47:18,620] WARN 
> [console-consumer-90116_f89a0b380f19-1452653212738-9f857257-leader-finder-thread], 
> Failed to find leader for Set([test,0]) 
> (kafka.consumer.ConsumerFetcherManager$LeaderFinderThread) 
> kafka.common.KafkaException: fetching topic metadata for topics 
> [Set(test)] from broker 
> [ArrayBuffer(BrokerEndPoint(0,192.168.99.100,9092))] failed at 
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73) at 
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94) at 
> kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66) 
> at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63) 
> Caused by: java.io.EOFException at 
> org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:83) 
> at 
> kafka.network.BlockingChannel.readCompletely(BlockingChannel.scala:129) 
> at kafka.network.BlockingChannel.receive(BlockingChannel.scala:120) 
> at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:77) 
> at 
> kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74) 
> at kafka.producer.SyncProducer.send(SyncProducer.scala:119)  at 
> kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59) 
> ... 3 more 

Warum erhalte ich den Fehler, und wie ich sie lösen?

Konfiguration

Laufen alle Komponenten in Docker-Container auf Mac. ZooKeeper und Kafka laufen in separaten Docker-Containern.

Docker Machine (boot2docker) IP-Adresse: 192.168.99.100 ZooKeeper Hafen: 2181 Kafka Hafen: 9092

Kafka Konfigurationsdatei server.properties stellt die folgenden:

host.name=localhost 
broker.id=0 
port=9092 
advertised.host.name=192.168.99.100 
advertised.port=9092 

Befehle

Ich betreiben die folgende Befehle aus dem Docker-Container des Kafka-Servers. Ich habe bereits ein Thema mit einer Partition und einem Replikationsfaktor von 1 erstellt.

Beachten Sie die Leader-Bezeichnung ist 0, die Teil des Problems sein könnte.

[email protected]:/opt/kafka/dist# ./bin/kafka-topics.sh --zookeeper 192.168.99.100:2181 --topic test --describe 
Topic:test PartitionCount:1 ReplicationFactor:1 Configs: 
    Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0 

ich dann folgenden werden einige Nachrichten senden:

[email protected]:/opt/kafka/dist# ./bin/kafka-console-producer.sh --broker-list 192.168.99.100:9092 --topic test 
one message 
two message 
three message 
four message 
[2016-01-13 02:49:40,078] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
[2016-01-13 02:50:40,080] ERROR Error when sending message to topic test with key: null, value: 11 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
[2016-01-13 02:51:40,081] ERROR Error when sending message to topic test with key: null, value: 13 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
[2016-01-13 02:52:40,083] ERROR Error when sending message to topic test with key: null, value: 12 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

Dies ist der Befehl, den ich versucht bin mit Nachrichten zu konsumieren, die den Verbraucher Fehler ergibt ich oben geschrieben.

[email protected]:/opt/kafka/dist# ./bin/kafka-console-consumer.sh --zookeeper 192.168.99.100:2181 --topic test --from-beginning 

Ich habe bestätigt Ports 2181 und 9092 sind offen und zugänglich aus dem Kafka Docker Behälter:

[email protected]:/# nc -z 192.168.99.100 2181; echo $?; 
0 
[email protected]:/# nc -z 192.168.99.100 9092; echo $?; 
0 

Antwort

4

Die Lösung war nicht das, was ich überhaupt erwartet. Die Fehlermeldung stimmte nicht mit dem überein, was wirklich geschah.

Das primäre Problem war das Mounten des Log-Verzeichnisses in Docker zu meinem lokalen Dateisystem. Mein docker run Befehl verwendete eine Datenträgerbereitstellung, um den Kafka-Ordner log.dir im Container in einem lokalen Verzeichnis auf der Host-VM zu mounten, die tatsächlich auf meinem Mac installiert war. Es ist der letzte Punkt, der das Problem war.

Zum Beispiel

docker run --name kafka -v /Users/<me>/kafka/logs:/var/opt/kafka:rw -p 9092:9092 -d kafka 

Da ich auf einem Mac bin und verwenden Docker-Maschine (z boot2docker), muss ich meine /Users/ Weg montieren, durch die boot2docker Auto-Halterungen in der Host-VM.Da die zugrunde liegende VM selbst einen Bind-Mount verwendet, konnte die I/O-Engine von Kafka nicht korrekt mit ihm kommunizieren. Wenn die Datenträgerbereitstellung in einem Verzeichnis direkt auf der Host-Linux-VM (d. H. Boot2docker-Maschine) ausgeführt wurde, würde sie funktionieren.

Ich kann die genauen Details nicht erklären, da ich die Ein- und Ausgänge von Kafka I/O nicht kenne, aber wenn ich das gemountete Volume zu meinem Mac-Dateisystem entferne, funktioniert es.