Kafka Connect S3 Source对接只读Schema Registry报42205错误问题咨询
使用Confluent官方提供的S3 Source连接器读取S3中存储的Avro格式记录,将数据回写到Kafka主题。当前已完成目标主题创建、Schema Registry部署,且已在Registry中注册了对应正确的Schema,但S3 Source连接器尝试将记录序列化写入目标主题时抛出如下异常:
Caused by: org.apache.kafka.common.errors.SerializationException:
Error registering Avro schema: ...
at io.confluent.kafka.serializers.AbstractKafkaAvroSerializer.serializeImpl(AbstractKafkaAvroSerializer.java:121)
at io.confluent.connect.avro.AvroConverter$Serializer.serialize(AvroConverter.java:143)
at io.confluent.connect.avro.AvroConverter.fromConnectData(AvroConverter.java:84)
... 15 more
Caused by: io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException:
Subject com-row-count-value is in read-only mode; error code: 42205
at io.confluent.kafka.schemaregistry.client.rest.RestService.sendHttpRequest(RestService.java:292)
at io.confluent.kafka.schemaregistry.client.rest.RestService.httpRequest(RestService.java:352)
at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:495)
at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:486)
at io.confluent.kafka.schemaregistry.client.rest.RestService.registerSchema(RestService.java:459)
at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.registerAndGetId(CachedSchemaRegistryClient.java:214)
at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.register(CachedSchemaRegistryClient.java:276)
at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.register(CachedSchemaRegistryClient.java:252)
at io.confluent.kafka.serializers.AbstractKafkaAvroSerializer.serializeImpl(AbstractKafkaAvroSerializer.java:75)
经排查,连接器内置生产者未优先查询已存在的schema_id,直接发起Schema写入注册请求,而当前使用的Schema Registry为只读模式,因此触发报错。需要确认该现象是产品已知问题,还是遗漏了相关配置项。
该现象不是产品已知缺陷,是缺少对应配置项导致的。AvroConverter默认逻辑是序列化时直接尝试注册当前持有的Schema,不会主动优先查询Schema Registry中已存在的Schema ID,哪怕待写入的Schema和Registry中已存的Schema完全一致,也会触发注册请求,在只读模式的Schema Registry环境下就会抛出42205错误。
在S3 Source连接器的配置中,给key、value对应的转换器添加如下参数,关闭自动注册Schema的行为即可:
key.converter.auto.register.schemas=falsevalue.converter.auto.register.schemas=false
如果业务中使用了Schema引用的场景,还需要额外追加以下配置,强制转换器使用已注册的最新版本Schema匹配ID:
key.converter.use.latest.version=truevalue.converter.use.latest.version=true
配置生效后,转换器序列化时会先向Schema Registry发起查询请求,匹配到结构完全一致的已注册Schema后,直接复用对应Schema ID完成序列化,不会再发起Schema注册请求,可正常适配只读模式的Schema Registry。
注意:需保证S3中存储的Avro数据对应的Schema,与Schema Registry中已注册的目标主题Schema结构完全兼容,否则会抛出Schema不匹配的序列化异常。
内容的提问来源于stack exchange,提问作者SeB.Fr

