8

Kiedy próbuję użyć skryptu producenta i konsumenta (0.9.0) firmy Kafka do wysyłania/odbierania wiadomości z tematu, otrzymuję poniższe błędy.Konsument Kafki "nie udało się znaleźć lidera" podczas pobierania metadanych tematu

Producent Błąd

[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) 

błąd konsumentów

> [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 

Dlaczego otrzymuję błąd i jak mogę go rozwiązać?

Konfiguracja

Running wszystkie składniki w Döcker pojemników na Mac. ZooKeeper i Kafka działające w oddzielnych kontenerach Docker.

Docker ciężki (boot2docker) Adres IP: 192.168.99.100 Heca port: 2181 Kafka port: 9092

Kafka plik konfiguracyjny server.properties ustawia następujące:

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

Polecenia

mogę uruchomić następujące polecenia z kontenera Docker serwera kafka. Utworzono już temat z jedną partycją i współczynnikiem replikacji 1.

Zauważ, że oznaczenie lidera to 0, co może być częścią problemu.

[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 

Następnie wykonaj następujące czynności, aby wysłać kilka wiadomości:

[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) 

To polecenie używam próbować spożywać wiadomości, które daje błąd konsumentów napisałem powyżej.

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

Ustaliliśmy porty 2181 i 9092 są otwarte i dostępne od wewnątrz pojemnika Kafka Docker:

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

Odpowiedz

4

Rozwiązanie nie było to, czego się spodziewałem w ogóle. Komunikat o błędzie nie zgadzał się z tym, co się naprawdę działo.

Głównym problemem było zamontowanie katalogu dzienników w Dockerze do mojego lokalnego systemu plików. Moja komenda docker run wykorzystała uchwyt woluminu do zamontowania folderu Kafka log.dir w kontenerze do lokalnego katalogu na maszynie wirtualnej hosta, która została faktycznie zamontowana na moim komputerze Mac. To właśnie ten ostatni problem stanowił problem.

Na przykład

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

Ponieważ jestem na Mac i używać Döcker-maszyna (np boot2docker), muszę zamontować w moim /Users/ ścieżce który boot2docker auto-wierzchowce w przyjmującym VM.Ponieważ sama podstawowa maszyna wirtualna korzysta z mocowania bind, mechanizm wejścia/wyjścia Kafki nie był w stanie poprawnie się z nim komunikować. Jeśli podłączenie woluminu było do katalogu bezpośrednio na maszynie wirtualnej Linux VM (tj. Na maszynie boot2docker), to działałoby.

Nie mogę dokładnie wyjaśnić szczegółów, ponieważ nie znam ins-and-out Kafki I/O, ale kiedy usuwam podłączony wolumin do mojego systemu plików Maca, to działa.

Powiązane problemy