web-dev-qa-db-ja.com

フィールド 'topic_metadata'の読み取りエラー:サイズ1139567の配列の読み取りエラー、45バイトのみ使用可能

-消費者

Properties props = new Properties();
        String groupId = "consumer-tutorial-group";
        List<String> topics = Arrays.asList("consumer-tutorial");
        props.put("bootstrap.servers", "192.168.1.75:9092");
        props.put("group.id", groupId);
        props.put("enable.auto.commit", "true");
        props.put("key.deserializer", StringDeserializer.class.getName());
        props.put("value.deserializer", StringDeserializer.class.getName());
        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
        try {
            consumer.subscribe(topics);
            while (true) {

                ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);
                for (ConsumerRecord<String, String> record : records)
                    System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());


            }
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            consumer.close();
        }
    }

私は上記のコードを書き込もうとしています。トピックから読み取ろうとする単純なコンシューマーコードですが、奇妙な例外が発生し、処理できません。

org.Apache.kafka.common.protocol.types.SchemaException: Error reading field 'topic_metadata': Error reading array of size 1139567, only 45 bytes available

私のプロデューサーコードも引用します

- プロデューサー

Properties props = new Properties();
        props.put("bootstrap.servers", "192.168.1.7:9092");
        props.put("acks", "all");
        props.put("retries", 0);
        props.put("batch.size", 16384);
        props.put("linger.ms", 1);
        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");

        Producer<String, String> producer = new KafkaProducer<String, String>(props);
        for(int i = 0; i < 100; i++)
            producer.send(new ProducerRecord<String, String>("consumer-tutorial", Integer.toString(i), Integer.toString(i)));

        producer.close();

これがkafka configsです

--zookeeperを起動します

bin/zookeeper-server-start.sh config/zookeeper.properties

-開始Kafkaサーバー

bin/kafka-server-start.sh config/server.properties

-トピックを作成します

bin/kafka-topics.sh --create --topic Consumer-tutorial --replication-factor 1 --partitions 3 --zookeeper 192.168.1.75:2181

-カフカ0.10.0

<dependency>
           <groupId>org.Apache.kafka</groupId>
           <artifactId>kafka-clients</artifactId>
           <version>0.10.0.0</version>
   </dependency>
   <dependency>
           <groupId>org.Apache.kafka</groupId>
           <artifactId>kafka_2.11</artifactId>
           <version>0.10.0.0</version>
   </dependency>
8
user5680169

kafka 0.9.0にダウングレードすることで問題を解決しましたが、それでも私にとっては効率的な解決策ではありません。誰かがこれをkafka 0.10.0バージョン、お気軽に投稿してください。それまではこれが私の解決策です

<dependency>
           <groupId>org.Apache.kafka</groupId>
           <artifactId>kafka-clients</artifactId>
           <version>0.9.0.0</version>
   </dependency>
   <dependency>
           <groupId>org.Apache.kafka</groupId>
           <artifactId>kafka_2.11</artifactId>
           <version>0.9.0.0</version>
   </dependency>
1
user5680169

バージョン0.10.0.0でkafka_2.11アーティファクトを使用する場合にも同じ問題が発生します。しかし、kafkaサーバーを0.10.0.0に変更すると、これは解決されました。以前は0.9.0.1を指していたのです。サーバーとpomバージョンが同期しているようです。

8
amarnath_rc

同じ問題があります。使用しているクライアントjarの互換性の問題Kafkaサーバー9.0.0およびKafkaクライアント10.0.0。基本的にKafka 0.10.0は新しいメッセージ形式を導入し、古いバージョンからトピックメタデータを読み取ることができませんでした。

<dependency>
 <groupId>org.springframework.kafka</groupId>
 <artifactId>spring-kafka</artifactId>
 <version>1.0.0.RELEASE</version> <!-- changed due lower version of the kafka server -->
</dependency>
0
Sulaha