繁体   English   中英

MongoSinkConnector 期望找到一个不存在的模式主题

[英]MongoSinkConnector expect to find a schema subject that doesn't exist

我正在尝试使用连接 MongoDB kafka 连接器接收器 (mongodb-kafka-connect-mongodb-1.7.0) 将 avro 事件从 kafka 写入 MongoDB。

我设置了一个与 kafka 消费者示例或我的自定义示例一起使用的模式注册表,它们都能够反序列化事件并打印它们。

另一方面,当我运行连接器时,出现以下异常:

Subject '<my-avro-schema-name>-value' not found.; error code: 40401

更高级别的堆栈跟踪消息是:

  • 由以下原因引起:org.apache.kafka.common.errors.SerializationException:检索 id 11 的 Avro 值模式版本时出错

  • 由以下原因引起:org.apache.kafka.connect.errors.DataException:无法将主题客户端订单请求的数据反序列化到 Avro:

事实上,这个主题或这个 id 不存在于架构注册表中,实际上我拥有的最高 id 是 10,我确实有一个名为<my-avro-schema-name>-key的主题。

为什么 MongoSinkConnector 试图找到一个不存在的主题?

连接属性:

bootstrap.servers=<value>
offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000
plugin.path=/git/1.libraries/kafka_2.12-2.2.0/plugins

MongoSink 属性:

name=<my-avro-schema-name>-sink
connector.class=com.mongodb.kafka.connect.MongoSinkConnector
connection.uri=mongodb://<value>
database=Test
collection=test
topics=test
key.converter=org.apache.kafka.connect.storage.StringConverter

value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://<address>

模式-registry.properties:

listeners=http://0.0.0.0:8081
kafkastore.bootstrap.servers=<address>
kafkastore.topic=_schemas
debug=false
auto.register.schemas=false
use.latest.version=true

Kafka生产者配置:

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "<broker-address>");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
props.put(ProducerConfig.CLIENT_ID_CONFIG, "Kafka Avro  Producer");
props.put("schema.registry.url", "<schema-registry>");

KafkaProducer<String, AllEventsUnion> producerRequest = new KafkaProducer<>(props);

AllEventsUnion clientOrderRequest = createClientOrderRequest();
            
final ProducerRecord<String, AllEventsUnion> producerOrderRequest = new ProducerRecord<>("all-events-union",
                    "ClientOrderRequest-" + calendar.getTimeInMillis(), clientOrderRequest);

AllEventsUnion 是多种类型的联合 avro 模式。 我正在使用它向同一个 kafka 主题发送不同的事件类型,这就是为什么我认为我需要事先注册它。 但显然您不需要在模式注册表中使用它们之前注册模式?

我有一个名为<my-avro-schema-name>-key的主题

这表明您拥有 Avro 密钥。

那为什么要用key.converter=org.apache.kafka.connect.storage.StringConverter而不是 AvroConverter?

实际上这个主题或这个 id 在模式注册表中不存在

然后,连接器上游的 Avro 生产者(如果存在)出现问题,并且没有使用模式注册表注册模式/主题或实际写入 Avro 数据。

为什么 MongoSinkConnector 试图找到一个不存在的主题?

因为您已经设置了它,并且主题中的数据包含一些不存在的主题的 ID。

value.converter=io.confluent.connect.avro.AvroConverter

在生成数据后注册模式不会修改您正在与其他 Avro 信息一起使用的主题中已有的数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM