Пример ошибки Apache Kafka: не удалось отправить сообщение после 3 попыток

Я запускаю этот пример производителя kafka, упомянутый на его сайте.

Код:

public class TestProducer {

    public static void main(String[] args) {
        long events = Long.parseLong(args[0]);
        Random rnd = new Random();
        Properties props = new Properties();
        props.put("metadata.broker.list", "host.broker-1:9093, host.broker-2:9093, host.broker-3:9095");
        props.put("serializer.class", "kafka.serializer.StringEncoder");
        props.put("partitioner.class", "test.app.SimplePartitioner");
        props.put("request.required.acks", "1");
        ProducerConfig config = new ProducerConfig(props);
        Producer<String, String> producer = new Producer<String, String>(config);
        for (long nEvents = 0; nEvents < events; nEvents++) { 
               long runtime = new Date().getTime();  
               String ip = "192.168.2." + rnd.nextInt(255); 
               String msg = runtime + ",www.example.com," + ip; 
               KeyedMessage<String, String> data = new KeyedMessage<String, String>("page_visits", ip, msg);
               producer.send(data);
        }
        producer.close();
    }
}

public class SimplePartitioner implements Partitioner{
    public SimplePartitioner (VerifiableProperties props) {

    }

    public int partition(Object key, int a_numPartitions) {
        int partition = 0;
        String stringKey = (String) key;
        int offset = stringKey.lastIndexOf('.');
        if (offset > 0) {
           partition = Integer.parseInt( stringKey.substring(offset+1)) % a_numPartitions;
        }
       return partition;
  }

}

Подробнее:

Я запускаю это приложение на хосте (вызов является производителем), который удален от хост-брокера [1-3]

  • Я могу выполнить ping и ssh на хост-брокер с хоста-производителя.

  • При условии, что в server.properties указано рекламируемое.host.name (в брокерах они называются server[1-3].properties соответственно).

Свойства:

broker.id=1
port=9093
host.name=host.broker.internal.name
advertised.host.name=host-broker1
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/1/kafka-logs-1,/data/2/kafka-logs-2
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181
zookeeper.connection.timeout.ms=6000

Любая идея о том, как исправить эту ошибку?


person krish7919    schedule 28.05.2014    source источник
comment
Судя по всему, ваш производитель не может отправлять сообщения в кластер Kafka. Наиболее распространенные причины заключаются в том, что конфигурация производителя неверна, или кластер не работает, или возникла проблема с сетью (например, маршрутизируемо ли объявленное имя брокера с хоста-производителя?). Трудно сказать больше из такого количества информации.   -  person sandris    schedule 28.05.2014
comment
@sandris, пожалуйста, взгляните на описание сейчас, если это поможет.   -  person Sambit Tripathy    schedule 29.05.2015
comment
Убедитесь, что вы можете подключиться через telnet со своего компьютера, на котором запущено приложение java: telnet host.broker-1 9093 От kafka Broker telnet к zookeeper: telnet zk1 2181 Я бы удалил все DNS-имена и попробовал необработанные IP-адреса. Например: props.put(metadata.broker.list, 0.0.0.0:9093) И удалите свойства: host.name=host.broker.internal.name Advertising.host.name=host-broker1   -  person phill.tomlinson    schedule 22.09.2015


Ответы (8)


Я получил эти ошибки при запуске производителя Kafka:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Решение найдено:

На моем компьютере Mac после загрузки scala-2.10 и kafka_2.10-0.8.1 в каталоге kafka_2.10-0.8.1 все в порядке, когда я запускаю zookeeper, сервер kafka и создаю тестовую тему. Затем мне нужно запустить производителя для тестовой темы. но есть ошибка:

yhuangMac:kafka_2.10-0.8.1 yhuang$ ./bin/kafka-console-producer.sh –broker-list localhost:9092 –topic test
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Причина в том, что в каталоге kafka libs zip-файл выпуска kafka включал только jar-файл slf4j-api, они пропустили jar-файл: slf4j-nop.jar, поэтому нам нужно перейти к http://www.slf4j.org, скачайте slf4j-1.7.7.zip, разархивируйте его, скопируйте slf4j-api-1.7.7, slf4j-nop-1.7.7.jar в каталог kafka libs.

Снова перезапустите производителя kafka, теперь об ошибке не сообщается.

Источник: РЕШЕНИЕ

person Zack S    schedule 10.07.2014
comment
Пробовал это, но не помогло. - person Gaurav Khare; 11.09.2015
comment
Этот ответ не имеет отношения к вопросу. - person OGrandeDiEnne; 30.06.2016

Вам нужно добавить реализацию ведения журнала SLF4j. если вы используете maven в качестве инструмента сборки, попробуйте добавить это в свой pom.xml и посмотрите, работает ли он.

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency>
person user2720864    schedule 28.05.2014
comment
Это только намекает, как настроить регистратор, а не как исправить настоящую проблему. - person om-nom-nom; 31.05.2014

Это решение исключения в исходном вопросе, заданном Кришем: «kafka.common.FailedToSendMessageException: не удалось отправить сообщения после 3 попыток».

Часто задаваемые вопросы здесь и здесь говорит, что ваше имя хоста должно быть установлено правильно. Я не испытывал такого состояния. Но я нашел еще одно условие, когда производитель kafka выдает это сообщение об ошибке: когда ваш ключ раздела в производителе неверен. То есть, если у вас топик с одним разделом, то ключ раздела в продуценте может быть как нулевым (сообщение отправляется на случайный раздел), так и 0 (нумерация разделов в кафке начинается с 0). Если вы попытаетесь использовать ключ раздела 1, это исключение будет выдано производителем. Или, если у вас есть 3 раздела в теме, и вы используете ключ раздела 3 (ключ 3 недействителен, поскольку допустимые номера разделов 0,1,2), это исключение выдается. Эта ошибка постоянна, когда номер раздела в методе send() производителя не совпадает с диапазоном разделов в теме. Я использовал кафку версии 0.8.2. В качестве клиентского API я использовал пакет kafka.javaapi.producer.Producer.

person prajod    schedule 19.03.2015

Это может произойти, если клиент не может получить ОБА имя хоста и IP-адрес брокера kafka.

Сделайте запись для клиентов \etc\hosts или C:\Windows\System32\drivers\etc\hosts, и это решило эту проблему для меня.

person Atul Soman    schedule 22.09.2015
comment
У меня была такая же проблема в OS X, и добавление записи hosts для брокера исправило ее. - person Odinodin; 28.12.2015

Я получил сообщение об ошибке от apache kafka:

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details

Моя установка:

OS: Ubuntu 14.04
sbt: sbt launcher version 0.13.5
scala: Scala code runner version 2.9.2

Удалось исправить это с помощью следующих команд:

cd /home/el/apachekafka/kafka_2.10-0.8.1.1/libs
wget http://www.slf4j.org/dist/slf4j-1.7.7.tar.gz
tar -xvf slf4j-1.7.7.tar.gz
cd /home/el/apachekafka/kafka_2.10-0.8.1.1/libs/slf4j-1.7.7
cp slf4j-api-1.7.7.jar ..
cp slf4j-nop-1.7.7.jar ..

Затем повторно запустите команду, и производитель не выдаст никакой ошибки.

person Eric Leschinski    schedule 21.08.2014
comment
Не полезно. Не помогло - person Gaurav Khare; 11.09.2015

Для HDP kafka используйте порт брокера: 6667

Для автономной кафки используйте порт брокера: 9092.

Ошибка была из-за номера порта, который мы использовали (HDP использует 6667, но мы использовали 9092).

bin/kafka-console-producer.sh --broker-list broker-ip:9092 --topic test // не работает

bin/kafka-console-producer.sh --broker-list broker-ip:6667 --topic test //работает

ссылка: Ошибка производителя консоли Kafka в песочнице Hortonworks HDP 2.3 < /а>

person Manju Shingadi    schedule 17.04.2016

Не уверен, но есть вероятность, что тема создана не на Кафке.

Проверьте веб-интерфейс для kafka и убедитесь, что тема, которую вы используете, например, «page_visits» для отправки данных, создана там.

Если нет, очень легко создать тему с помощью графического интерфейса.

person Ankit Chaudhary    schedule 30.07.2015

Я столкнулся с этой ошибкой в ​​Hortonworks HDP 2.2, где порт по умолчанию установлен на 6667. Если ваш сервер kafka работает в песочнице HDP, разрешение должно установить metadata.broker.list как 10.0.2.15:6667. Пожалуйста, следуйте этому коду.

            Properties props = new Properties();
            props.put("metadata.broker.list", "10.0.2.15:6667");
            props.put("serializer.class", "kafka.serializer.StringEncoder");
            //props.put("producer.type","async");
            props.put("request.required.acks", "1");
            ProducerConfig config = new ProducerConfig(props);

            Producer<String, String> producer = new Producer<String, String>(config);
            try{        
            producer.send(new KeyedMessage<String, String>("zerg.hydra", jsonPayload));

            producer.close();
        }catch(Exception e){
            e.printStackTrace();
        }
person Gaurav Khare    schedule 11.09.2015