web-dev-qa-db-fra.com

Kafka 0.10 Java Client TimeoutException: Lot contenant 1 enregistrement (s) expiré (s)

J'ai un noeud unique, multi (3) courtier installer Zookeeper/Kafka. J'utilise le client Java Kafka 0.10.

J'ai écrit ce qui suit simple à distance (sur un serveur différent de Kafka) Producer (dans le code, j'ai remplacé mon adresse IP publique par MYIP):

Properties config = new Properties();
try {
    config.put(ProducerConfig.CLIENT_ID_CONFIG, InetAddress.getLocalHost().getHostName());
    config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "MYIP:9092, MYIP:9093, MYIP:9094");
    config.put(ProducerConfig.ACKS_CONFIG, "all");
    config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.Apache.kafka.common.serialization.StringSerializer");
    config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.Apache.kafka.common.serialization.ByteArraySerializer");
    producer = new KafkaProducer<String, byte[]>(config);
    Schema.Parser parser = new Schema.Parser();
    schema = parser.parse(GATEWAY_SCHEMA);
    recordInjection = GenericAvroCodecs.toBinary(schema);
    GenericData.Record avroRecord = new GenericData.Record(schema);
    //Filling in avroRecord (code not here)
    byte[] bytes = recordInjection.apply(avroRecord);

    Future<RecordMetadata> future = producer.send(new ProducerRecord<String, byte[]>(datasetId+"", "testKey", bytes));
    RecordMetadata data = future.get();
} catch (Exception e) {
    e.printStackTrace();
}

Mes propriétés de serveur pour les 3 courtiers ressemblent à ceci (dans les 3 fichiers de propriétés de serveur différents, broker.id vaut 0, 1, 2 et listeners est PLAINTEXT: //: 9092, PLAINTEXT: //: 9093, PLAINTEXT: //: 9094 et Host.name est 10.2.0.4, 10.2.0.5, 10.2.0.6). Ceci est le premier fichier de propriétés du serveur:

broker.id=0
listeners=PLAINTEXT://:9092
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=/tmp/kafka1-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=6000

Quand j'exécute le code, j'obtiens l'exception suivante:

Java.util.concurrent.ExecutionException: org.Apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for 100101-0
    at org.Apache.kafka.clients.producer.internals.FutureRecordMetadata.valueOrError(FutureRecordMetadata.Java:65)
    at org.Apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.Java:52)
    at org.Apache.kafka.clients.producer.internals.FutureRecordMetadata.get(FutureRecordMetadata.Java:25)
    at com.nr.roles.gateway.GatewayManager.addTransaction(GatewayManager.Java:212)
    at com.nr.roles.gateway.gw.service(gw.Java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:790)
    at org.Eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.Java:821)
    at org.Eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.Java:583)
    at org.Eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.Java:1158)
    at org.Eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.Java:511)
    at org.Eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.Java:1090)
    at org.Eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.Java:141)
    at org.Eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.Java:109)
    at org.Eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.Java:119)
    at org.Eclipse.jetty.server.Server.handle(Server.Java:517)
    at org.Eclipse.jetty.server.HttpChannel.handle(HttpChannel.Java:308)
    at org.Eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.Java:242)
    at org.Eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.Java:261)
    at org.Eclipse.jetty.io.FillInterest.fillable(FillInterest.Java:95)
    at org.Eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.Java:75)
    at org.Eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.Java:213)
    at org.Eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.Java:147)
    at org.Eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.Java:654)
    at org.Eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.Java:572)
    at Java.lang.Thread.run(Thread.Java:745)
 Caused by: org.Apache.kafka.common.errors.TimeoutException: Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for 100101-0

Est-ce que quelqu'un sait ce que je manque? Toute aide serait appréciée. Merci beaucoup

7
Armen

Je rencontre les mêmes problèmes.

Vous devriez changer votre kafka server.properties pour spécifier l'adresse IP. par exemple:

PLAINTEXT://YOUIP:9093

sinon, kafka utilisera le nom d'hôte, si le producteur ne peut pas obtenir l'hôte, il ne peut pas envoyer de message à kafka même si vous pouvez les connecter par telnet.

4
smartwjw

Les informations de port dans votre configuration BOOTSTRAP_SERVERS_CONFIG sont incorrectes (MYIP: 9092 ). 

Comme vous l'avez mentionné dans server.properties, "PLAINTEXT: //: 9093, PLAINTEXT: //: 9093, PLAINTEXT: //: 9094".

1

Cette réponse partage un aperçu. Vous pouvez augmenter la configuration request.timeout.ms Producer qui permettra au client de mettre les lots en file d'attente plus longtemps avant leur expiration.

Vous voudrez peut-être aussi regarder dans les configurations batch.size et linger.ms et trouver l’optimum qui fonctionne dans votre cas.

0
Tanvir