[英]Getting SerializationException while producing avro records to an avro kafka topic
我们有一个 akka-scala 应用程序,我们正在处理传入的消息。 之后,我们尝试将该消息写入一个 kafka 主题,该主题是一个 avro kafka 主题。 在编写时,我们得到以下异常:
org.apache.kafka.common.errors.SerializationException: Error registering Avro schema Caused by: io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException: Internal Server Error; 错误代码:500
我们检查了模式注册表工作正常并且主题和版本存在。 我们没有注册任何已经存在的新模式。 我们正在使用 scala 2.13.8 并尝试使用不同的融合 kafka avro 序列化程序版本,如 5.1.0、5.2.0、5.3.0、6.1.3。 你能告诉这可能是什么原因。
禁用自动注册模式后,此错误已修复。 我们在生产者设置中设置了标志auto.register.schemas = false
并解决了问题。
以下是完整的生产者设置供参考:
object KafkaSinkSettings {
val BootstrapServers = sys.env.get(Constants.BOOTSTRAP_SERVERS)
val ProducerConfig = Constants.PRODUCER_CONFIG
val SchemaRegistryUrl = sys.env.get(Constants.SCHEMA_REGISTRY_URL)
val Topic = sys.env.get(Constants.TOPIC)
val ClientId = Constants.METRICS_PREFIX
val MaxInFlightReqPerConn = sys.env.get(Constants.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION)
val RetriesConfig = sys.env.get(Constants.RETRIES_CONFIG)
val RequestTimeoutMSConfig = sys.env.get(Constants.REQUEST_TIMEOUT_MS_CONFIG)
val RetryBackoffMsConfig = sys.env.get(Constants.RETRY_BACKOFF_MS_CONFIG)
def apply(implicit config: Config): KafkaSinkSettings = new KafkaSinkSettings()
}
class KafkaSinkSettings(implicit config: Config) {
val producerConfig = config.getConfig(KafkaSinkSettings.ProducerConfig)
val kafkaAvroSerDeConfig = Map[String, Any](
AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG -> KafkaSinkSettings.SchemaRegistryUrl.getOrElse(
config.getString("kafka.schema-registry-url")),
AbstractKafkaAvroSerDeConfig.AUTO_REGISTER_SCHEMAS -> config.getString("kafka.auto-register-schemas"),
ProducerConfig.BOOTSTRAP_SERVERS_CONFIG -> KafkaSinkSettings.BootstrapServers.getOrElse(
config.getString("kafka.bootstrap-servers")),
KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG -> true.toString
)
def createAvroProducerSettings(): ProducerSettings[String, AnyRef] = {
val kafkaAvroSerializer = new KafkaAvroSerializer()
kafkaAvroSerializer.configure(kafkaAvroSerDeConfig.asJava, false)
val producerSettings = ProducerSettings(producerConfig, new StringSerializer, kafkaAvroSerializer)
.withBootstrapServers(KafkaSinkSettings.BootstrapServers.getOrElse(
config.getString("kafka.bootstrap-servers")))
.withProperty(ProducerConfig.CLIENT_ID_CONFIG, KafkaSinkSettings.ClientId + randomClientIdPostfix)
.withProperty(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, KafkaSinkSettings.MaxInFlightReqPerConn.getOrElse(
config.getString("kafka.max-in-flight-requests-per-connection")
))
.withProperty(ProducerConfig.RETRIES_CONFIG, KafkaSinkSettings.RetriesConfig.getOrElse(
config.getString("kafka.retries-config")
))
.withProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, KafkaSinkSettings.RequestTimeoutMSConfig.getOrElse(
config.getString("kafka.request-timeout-ms-config")
))
.withProperty(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, KafkaSinkSettings.RetryBackoffMsConfig.getOrElse(
config.getString("kafka.retry-backoff-ms-config")
))
producerSettings
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.