web-dev-qa-db-fra.com

Exemple d'erreur Apache Kafka: échec de l'envoi du message après 3 tentatives

Je cours cet exemple de producteur de kafka mentionné sur son site

Le code:

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;
  }

}

Plus de détails:

J'exécute cette application sur un hôte (appel est le producteur) distant de Host-broker [1-3].

  • Je peux cingler et ssh le courtier hôte du producteur hôte.

  • Fourni le nom.hôte.publié dans le fichier server.properties (ils sont nommés respectivement serveur [1-3] .properties dans les courtiers

Les propriétés:

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

Une idée sur la façon de corriger cette erreur?

14
krish7919

J'ai eu ces erreurs lors de l'exécution d'un producteur 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.

Solution trouvée:

Sur mon ordinateur Mac, après avoir téléchargé les scala-2.10 et kafka_2.10-0.8.1, dans le répertoire kafka_2.10-0.8.1, tout va bien lorsque je lance zookeeper, serveur kafka et que je crée un sujet de test. Ensuite, je dois démarrer un producteur pour le sujet de test. mais il y a une erreur:

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.

La raison en est que, dans le répertoire kafka libs, le fichier Zip de la version kafka n'incluait que le fichier jar de slf4j-api, ils ont raté un fichier jar: slf4j-nop.jar; nous devons donc accéder à http: // www. slf4j.org , téléchargez slf4j-1.7.7.Zip, puis décompressez-le, copiez le fichier slf4j-api-1.7.7, slf4j-nop-1.7.7.jar dans le répertoire libs de kafka. 

Redémarrez à nouveau le producteur de kafka. Aucune erreur n’est signalée.

Source: SOLUTION

9
Zack S

Vous devez ajouter l'implémentation de journalisation SLF4j. Si vous utilisez maven comme outil de compilation, essayez d’ajouter ceci à votre fichier pom.xml et voyez si cela fonctionne.

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency>
3
user2720864

Cela peut arriver si le client ne peut pas atteindre les deux noms d'hôte et IP du courtier kafka.

Faites une entrée dans les clients\etc\hosts ou C:\Windows\System32\drivers\etc\hosts et cela a résolu ce problème pour moi.

2
Atul Soman

Ceci est une solution à l'exception de la question initiale posée par Krish: "kafka.common.FailedToSendMessageException: Échec d'envoi de messages après 3 tentatives."

Le FAQ here et here indique que votre nom d'hôte doit être défini correctement. Je n'ai pas connu cette condition. Mais j'ai trouvé une autre condition lorsqu'un producteur de kafka donne ce message d'erreur: lorsque votre clé de partition dans le producteur est fausse. Autrement dit, si vous avez un sujet avec une partition, la clé de partition du producteur peut être soit nulle (le message est envoyé à une partition aléatoire), soit 0 (les partitions dans kafka sont numérotées à partir de 0). Si vous essayez d'utiliser une clé de partition de 1, cette exception est renvoyée dans le producteur. Ou si vous avez 3 partitions dans le sujet et que vous utilisez une clé de partition de 3 (la clé de 3 n'est pas valide car les numéros de partition valides sont 0,1,2), cette exception est levée. Cette erreur est cohérente lorsque le numéro de partition de la méthode send () du producteur ne correspond pas à la plage de partitions de la rubrique. J'ai utilisé kafka version 0.8.2. L'API client que j'ai utilisée était le paquet kafka.javaapi.producer.Producer.

2
prajod

Port du courtier d'utilisation de kafka de ForHDP: 6667

Pour le kafka autonome utiliser le port du courtier: 9092

L'erreur était due au port non que nous utilisions (HDP utilise 6667 mais nous utilisions 9092)

bin/kafka-console-producer.sh --broker-list broker-ip: 9092 --testique // ne fonctionne pas

bin/kafka-console-producer.sh --broker-list broker-ip: 6667 --testique // fonctionne

link: Erreur du producteur de console Kafka dans le bac à sable Hortonworks HDP 2.3

1
Manju Shingadi

J'ai eu l'erreur d'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

Ma configuration:

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

A été capable de le réparer avec ces commandes:

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

Ensuite, relancez la commande et le producteur ne génère aucune erreur.

1
Eric Leschinski

J'ai rencontré cette erreur dans Hortonworks HDP 2.2 où le port par défaut est défini sur 6667. Si votre serveur kafka s'exécute sur un sandbox HDP, la résolution consiste à définir Metadata.broker.list sur 10.0.2.15 : 6667 Veuillez suivre ce code.

            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();
        }
0
Gaurav Khare

Pas sûr, mais une possibilité pourrait être que le sujet ne soit pas créé sur Kafka. 

Vérifiez l'interface utilisateur Web de kafka et assurez-vous que le sujet que vous utilisez, c'est-à-dire "page_visits" pour envoyer les données, y est créé. 

Sinon, il est très facile de créer le sujet en utilisant l'interface graphique.

0
Ankit Chaudhary