繁体   English   中英

在为 avro kafka 主题生成 avro 记录时获取 SerializationException

[英]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.

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