Kafka consumer "не удалось найти лидера" при извлечении метаданных темы

когда я пытаюсь использовать сценарий Kafka producer and consumer (0.9.0) для push/pull сообщений из темы, я получаю ошибки ниже.

Ошибка Производителя

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

почему я получаю ошибку и как ее разрешить?

конфигурация

запуск всех компонентов контейнеры Docker на Mac. ZooKeeper и Кафка работают в отдельном Докере стеклотара.

IP-адрес машины Docker (boot2docker):192.168.99.100 Смотритель Порта: 2181 Кафка Порт:9092

Кафка конфигурационный файл server.properties устанавливает следующее:

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

команды

я запускаю следующие команды из контейнера Docker сервера kafka. Я уже создал тему с одним разделом и коэффициентом репликации 1.

уведомления обозначение лидера 0 что может быть частью проблемы.

root@f89a0b380f19:/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

затем я делаю следующее, чтобы отправить некоторые сообщения:

root@f89a0b380f19:/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)

это команда, которую я использую, чтобы попытаться использовать сообщения, которые дают ошибку потребителя, которую я опубликовал выше.

root@f89a0b380f19:/opt/kafka/dist# ./bin/kafka-console-consumer.sh --zookeeper 192.168.99.100:2181 --topic test --from-beginning

Я подтвердил порты 2181 и 9092 открыты и доступны из контейнера Kafka Docker:

root@f89a0b380f19:/# nc -z 192.168.99.100 2181; echo $?;
0
root@f89a0b380f19:/# nc -z 192.168.99.100 9092; echo $?;
0

1 ответов


решение было совсем не таким, как я ожидал. Сообщение об ошибке не соответствовало тому, что происходило на самом деле.

основной проблемой было подключение каталога журнала в Docker к моей локальной файловой системе. Мой docker run команда использовала монтирование тома для монтирования Kafka log.dir папка в контейнере в локальный каталог на хосте VM, который был фактически смонтирован на моем Mac. В этом-то и была проблема.

например,

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

С Я на Mac и использую docker-машину (например, boot2docker), я должен монтировать через мой /Users/ путь, который boot2docker авто-держатели в ВМ. Поскольку сама базовая виртуальная машина использует крепление привязки, механизм ввода-вывода Kafka не смог правильно связаться с ней. Если бы монтирование Тома было в каталог непосредственно на хосте Linux VM (т. е. машине boot2docker), это сработало бы.

Я не могу объяснить точные детали, так как я не знаю входов и выходов Kafka I/O, но когда я удаляю смонтированный том в моей файловой системе Mac работает.