#amazon-ec2 #apache-kafka
#amazon-ec2 #apache-kafka
Вопрос:
Я смог заставить kafka нормально работать, когда я развернул его на своем локальном компьютере. Но когда я пытаюсь заставить его работать на экземпляре AWS, кажется, что ничего не работает правильно. Я попытался запустить свой собственный сервер и сделать то же самое, что я делал локально, запустив zookeeper и kafka вот так
curl http://apache.spinellicreations.com/kafka/0.10.0.0/kafka_2.11-0.10.0.0.tgz | tar -xzf
cd kafka_2.11-0.10.0.0
bin/zookeeper-server-start.sh config/zookeeper.properties amp;
bin/kafka-server-start.sh config/server.properties amp;
Я также пытался использовать AMI от bitami, который, похоже, является универсальным AMI. Создание темы, похоже, работает нормально. Но когда я пытаюсь запустить производителя консоли, я получаю сообщение об ошибке
SEASPAULSON-MAC:kafka_2.11-0.10.0.0 spaulson$ bin/kafka-console-producer.sh --broker-list ec2-54-186-31-109.us-west-2.compute.amazonaws.com:9092 --topic test
blah
[2016-10-20 12:13:23,395] ERROR Error when sending message to topic test with key: null, value: 4 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for test-0
Я также получаю ошибку при попытке запустить консольного потребителя, которая повторяется снова и снова.
bin/kafka-console-consumer.sh --zookeeper ec2-54-186-31-109.us-west-2.compute.amazonaws.com:2181 --topic test --from-beginning
[2016-10-19 18:26:47,175] WARN Fetching topic metadata with correlation id 152 for topics [Set(test)] from broker [BrokerEndPoint(0,ip-172-31-52-58.ec2.internal,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:80)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:79)
at kafka.producer.SyncProducer.send(SyncProducer.scala:124)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
Я чувствую, что такого рода операции должны быть тривиальными, но это оказывается очень сложным. У меня возникли проблемы с поиском документации о том, как диагностировать проблемы и выяснить, что происходит не так. Лучшее, что я нашел, — это эта команда
KAFKA_HOME/bin/kafka-topics.sh --describe --topic test --zookeeper ec2-54-186-31-109.us-west-2.compute.amazonaws.com:2181
Topic:test PartitionCount:1 ReplicationFactor:1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Указывает ли лидер: 0, что что-то пошло не так? Но что?
Комментарии:
1. Для AWS или других компьютеров IaaS попробуйте установить advertised.listeners для своих клиентов
2. Мне нужно установить объявленных слушателей на клиенте? Как на компьютере, с которого я пытаюсь подключиться? Я подумал, что указания этого в качестве аргумента для сценария оболочки будет достаточно.
3. Это конфигурация брокера, которая должна быть установлена в «server.properties». Затем перезапустите брокеров.
4. Это сработало, но вы должны были указать это как ответ, чтобы я мог его принять.
Ответ №1:
Для AWS или любых других компьютеров IaaS вы должны установить «advertised.listeners» для клиентов. Вот что означают эти параметры в документе Kafka:
Прослушиватели для публикации в ZooKeeper для использования клиентами, если они отличаются от прослушивателей выше. В средах IaaS это может отличаться от интерфейса, к которому привязывается брокер. Если это значение не установлено, будет использоваться значение для
listeners
.