web-dev-qa-db-ja.com

Kafka)のフィールド 'topic_metadata'の読み取りエラー

Server.propertiesファイルでauto.create.topics.enable = trueを使用してawsでブローカーに接続しようとしています。しかし、Javaクライアントプロデューサーを使用してブローカーに接続しようとすると、次のerrorが表示されます。

1197 [kafka-producer-network-thread |プロデューサー-1]エラーorg.Apache.kafka.clients.producer.internals.Sender-kafkaプロデューサーI/Oスレッド:org.Apache.kafka.common.protocol.typesでキャッチされないエラー。 SchemaException:フィールド 'topic_metadata'の読み取りエラー:サイズ619631の配列の読み取りエラー:org.Apache.kafkaのorg.Apache.kafka.common.protocol.types.Schema.read(Schema.Java:73)で使用できるのは37バイトのみです。クライアント.NetworkClient.parseResponse(NetworkClient.Java:380)at org.Apache.kafka.clients.NetworkClient.handleCompletedReceives(NetworkClient.Java:449)at org.Apache.kafka.clients.NetworkClient.poll(NetworkClient.Java:269) org.Apache.kafka.clients.producer.internals.Sender.run(Sender.Java:229)at org.Apache.kafka.clients.producer.internals.Sender.run(Sender.Java:134)at Java.lang .Thread.run(不明なソース)

以下は私のクライアントプロデューサーコードです。

public static void main(String[] argv){
         Properties props = new Properties();
         props.put("bootstrap.servers", "http://XX.XX.XX.XX:9092");
         props.put("acks", "all");
         props.put("retries", 0);
         props.put("batch.size", 16384);
         props.put("linger.ms", 0);
         props.put("buffer.memory", 33554432);
         props.put("key.serializer", "org.Apache.kafka.common.serialization.StringSerializer");
         props.put("value.serializer", "org.Apache.kafka.common.serialization.StringSerializer");
         props.put("block.on.buffer.full",true);
         Producer<String, String> producer = new KafkaProducer<String, String>(props);
        try{ for(int i = 0; i < 10; i++)
        { producer.send(new ProducerRecord<String, String>("topicjava", Integer.toString(i), Integer.toString(i)));
             System.out.println("Tried sending:"+i);}
        }
        catch (Exception e){
            e.printStackTrace();
        }
         producer.close();
}

誰かが私がこれを解決するのを手伝ってもらえますか?

8
user2966021

私も同様の問題に直面しています。ここでの問題は、pomファイルのkafkaクライアントのバージョンとkafkaサーバーが異なる。kafkaクライアント0.10.0.0_1ですが、kafkaサーバーはまだ0.9.0.0のままでした。そこで、kafkaサーバーバージョンを10にアップグレードしました。解決しました。

<dependency>
            <groupId>org.Apache.servicemix.bundles</groupId>
            <artifactId>org.Apache.servicemix.bundles.kafka-clients</artifactId>
            <version>0.10.0.0_1</version>
        </dependency>            
3
Sanjeev

クライアント側で間違ったプロパティを設定していたようです。また、server.propertiesファイルに、使用しているクライアント用ではないプロパティが含まれていたため、Javaクライアントをバージョン0.9に変更することにしました。 .0mavenを使用します。

<dependency>
<groupId>org.Apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.9.0.0</version>
</dependency>

私のserver.propertiesファイルは以下の通りです。

broker.id=0
port=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/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
log.cleaner.enable=false
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=9000
delete.topic.enable=true
advertised.Host.name=<aws public Ip>
advertised.port=9092

私のプロデューサーコードは次のようになります

    import Java.util.Properties;
    import Java.util.concurrent.ExecutionException;

    import org.Apache.kafka.clients.producer.KafkaProducer;
    import org.Apache.kafka.clients.producer.ProducerConfig;
    import org.Apache.kafka.clients.producer.ProducerRecord;
    import org.Apache.kafka.common.serialization.StringSerializer;
    public class HelloKafkaProducer 
     {


       public static void main(String args[]) throws InterruptedException,      ExecutionException {
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"IP:9092");
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        KafkaProducer<String,String> producer = new KafkaProducer<String,String>(props);

        boolean sync = false;
        String topic="loader1";
        String key = "mykey";
        for(int i=0;i<1000;i++)
        {
        String value = "myvaluehasbeensent"+i+i;
        ProducerRecord<String,String> producerRecord = new ProducerRecord<String,String>(topic, key, value);
        if (sync) {
            producer.send(producerRecord).get();
        } else {
            producer.send(producerRecord);
        }
        }
        producer.close();
    }
 }
1
user2966021

正しいバージョンを使用していることを確認してください。次のMaven依存関係を使用するとします。

<dependency>
  <groupId>org.Apache.flink</groupId>
  <artifactId>flink-connector-kafka-0.8_2.10</artifactId>
  <version>${flink.version}</version>
</dependency>

したがって、アーティファクトは次のようになります。flink-connector-kafka-0.8_2.1

次に、正しいKafkaバージョンを使用しているかどうかを確認します:

cd /KAFKA_HOME/libs

ここで、kafka_YOUR-VERSION-sources.jarを見つけます。

私の場合、kafka_2.10-0.8.2.1-sources.jarです。だからそれはうまくいきます! :)異なるバージョンを使用している場合は、Mavenの依存関係を変更するだけですOR正しいkafkaバージョンをダウンロードしてください。

1
lidox