web-dev-qa-db-ja.com

Kafka 0.10 Java Client TimeoutException:1つのレコードを含むバッチの有効期限が切れました

私は単一ノード、マルチ(3)ブローカーZookeeper/Kafkaセットアップを持っています。Kafka 0.10 Javaクライアント。

私は次の単純なリモート(Kafkaとは異なるサーバー上)プロデューサーを作成しました(コードでは、パブリックIPアドレスを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();
}

3つのブローカーのサーバープロパティは次のようになります(3つの異なるサーバープロパティファイルでは、broker.idは0、1、2であり、リスナーはPLAINTEXT://:9092、PLAINTEXT://:9093、PLAINTEXT://:9094です。 Host.nameは10.2.0.4、10.2.0.5、10.2.0.6)です。これは最初のサーバープロパティファイルです。

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

コードを実行すると、次の例外が発生します。

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

誰かが私が欠けているものを知っていますか?どんな助けでもいただければ幸いです。どうもありがとう

8
Armen

私は同じ問題に遭遇します。

kafka server.propertiesを変更して、IPアドレスを指定する必要があります。例:

PLAINTEXT://YOUIP:9093

そうでない場合、kafkaはホスト名を使用します。プロデューサーがホストを取得できない場合、Telnet接続できてもkafkaにメッセージを送信できません。

4
smartwjw

BOOTSTRAP_SERVERS_CONFIG構成のポート情報が正しくありません(MYIP:9092)。

Server.propertiesで「PLAINTEXT://:9093、PLAINTEXT://:9093、PLAINTEXT://:9094」と述べたように。

This 回答はいくつかの洞察を共有しています。 request.timeout.ms プロデューサー構成を増やすことができます。これにより、クライアントは、有効期限が切れる前にバッチをより長くキューに入れることができます。

batch.size および linger.ms の構成を調べて、自分のケースで機能する最適な構成を見つけることもできます。

0
Tanvir