2016-01-25 2 views
9

У меня проблемы с поиском неисправностей, что должно быть простой проблемой kafka.Kafka - Docker - Ошибка при отправке сообщения от Host to Container (Batch Expired)

Я пытаюсь опубликовать несколько сообщений от kafak-console-producer. Когда я типа «привет» я получаю:

/opt/kafka/bin/kafka-console-producer.sh --topic test --broker-list 172.17.0.21:9092 
hi 
[2016-01-25 12:56:19,839] ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Batch Expired (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

Я, кажется, не быть в состоянии найти Кафка-log4j-журналы ...

Я бегу серверу Кафка так, как это описанный в quick-start

Я могу создать тему & описать ее.

Одно замечание, которое может быть важно, что kafka & zookeeper работает в контейнере-докере (172.17.0.21) Я создаю тему и отправляю сообщения от хоста.


Обратите внимание, как (Кафка-сервер) 9092 & (гк) 2181 открыты и доступны с хоста, я подтвердил это с помощью NETSTAT & телнета.

+0

Какой версии Кафки? Запуск общего образа Docker или того, который вы создали самостоятельно? Что такое команда 'docker run', которую вы используете для запуска контейнера? Вы изменили конфигурацию Kafka по умолчанию? Вы используете ZK в отдельном контейнере? –

+0

@MarkoBonaci - эта проблема убила меня, но я узнал несколько ценных уроков. Это мой собственный образ докеров. Отправил ответ. – hba

ответ

13

Оказался больше вопроса Докер ...

OK, при запуске клиента kafka-console-consumer.sh я видел, что он пытается подключиться к брокеру, используя имя контейнера (который несколько первых символов GUID).

Мой хост не может разрешить подключение к контейнеру-докеру с использованием имени хоста.

Поскольку я уже сопоставил порты с моим хостом, я изменил конфигурацию kafak-server advertised.host.name, чтобы указать на IP-адрес моего хоста.

Таким образом, когда запрашивается zk для брокера, возвращается IP-адрес моего хозяина, а затем через переадресацию через порт я подключен к брокеру в докере.

+0

Да, 'advertised.host.name' была моей первоначальной мыслью ([общая проблема] (http://stackoverflow.com/a/34494443/465710)), но я хотел получить дополнительную информацию, прежде чем упоминать об этом. –

+0

Вы изменили это в своей конфигурации kafka-server в контейнере докера? – Jonathan

0

Кстати, вы знаете, что вы можете установить эту переменную из команды docker run, верно?

E.g. это то, как я начинаю Кафка & ZK в одном контейнере, для моей локальной среды разработки:

docker run --name st-kafka -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=`docker-machine ip machine_name` -e ADVERTISED_PORT=9092 -d spotify/kafka 

Затем, чтобы создать тему:

docker exec -ti st-kafka bash -c "/opt/kafka_*/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic_name" 

Это на OS X, поэтому я использую docker-machine ip MACHINE_NAME.
Как вы можете видеть, это образ Spotify. Хотя в последний раз я не проверял v0.9, тривиально разветвить Dockerfile и настроить для 0.9.

+0

спасибо. Я построил свой собственный образ ... Я не использовал spotify. – hba

+0

Не могли бы вы его решить? – nanounanue

2

Я пытаюсь с Кафкой 0.10.0.0 в докер и нашел ниже DEPRECATED

advertised.host.name: используется только при advertised.listeners или listeners не установлены. Вместо этого используйте advertised.listeners. Имя хоста для публикации в ZooKeeper для использования клиентами.В средах IaaS это, возможно, должно отличаться от интерфейса до , с которым связывается брокер. Если это не установлено, оно будет использовать значение для host.name, если оно настроено. В противном случае он будет использовать возвращаемое значение из java.net.InetAddress.getCanonicalHostName().

так множество advertised.listeners = PLAINTEXT: // вашдомно: 9092 будет работать

Смежные вопросы