java解析kafkaavro_apache-kafka - 通过Kafka Connect读取AVRO编码的消息(由KSQL流创建) - SO中文参考 - www.soinside.com...

在使用KSQL将JSON数据转换为AVRO格式并尝试通过KafkaConnect将其同步到BigQuery时遇到问题。KafkaConnect在处理AVRO消息时抛出异常,提示无法检索ID为0的AVRO架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们通过KSQL创建AVRO消息并尝试使用Kafka Connect使用它们时,发生了一些奇怪的事情。一点上下文:

源数据第三方提供商在我们的Kafka集群之一上以JSON形式生成数据(到目前为止,还不错)。我们实际上看到了数据。

数据转换由于我们的内部系统需要在AVRO中对数据进行编码,因此我们创建了一个KSQL集群,该集群通过在KSQL中创建以下流将输入的数据转换为AVRO:{

"ksql": "

CREATE STREAM src_stream (browser_name VARCHAR)

WITH (KAFKA_TOPIC='json_topic', VALUE_FORMAT='JSON');

CREATE STREAM sink_stream WITH (KAFKA_TOPIC='avro_topic',VALUE_FORMAT='AVRO', PARTITIONS=1, REPLICAS=3) AS

SELECT * FROM src_stream;

",

"streamsProperties": {

"ksql.streams.auto.offset.reset": "earliest"

}

}

(到目前为止,很好)

随着偏移量的增加,我们看到了从JSON主题到AVRO主题的数据。

然后,我们在(新的)Kafka Connect集群中创建一个Kafka连接器。在某些情况下,我们正在使用多个Kafka Connect集群(这些集群具有相同的属性),因此,我们正在为该数据运行一个Kafka Connect集群,但为其他AVRO数据提供了该集群的精确副本(1用于分析,我们的业务数据为1)。

此连接器的接收器是BigQuery,我们正在使用Wepay BigQuery Sink连接器1.2.0。再一次,到目前为止,很好。使用此连接器,我们的业务集群运行良好,并且业务集群上的AVRO主题已流入BigQuery。

但是,当我们尝试使用前面我们的KSQL语句创建的AVRO主题时,我们看到抛出了异常:/

以下为例外:org.apache.kafka.connect.errors.ConnectException: Tolerance exceeded in error handler

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:178)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:104)

at org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:510)

at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:490)

at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:321)

at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:225)

at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:193)

at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)

at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: org.apache.kafka.connect.errors.DataException: dpt_video_event-created_v2

at io.confluent.connect.avro.AvroConverter.toConnectData(AvroConverter.java:98)

at org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$0(WorkerSinkTask.java:510)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:128)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:162)

... 13 more

Caused by: org.apache.kafka.common.errors.SerializationException: Error retrieving Avro schema for id 0

Caused by: io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException: Schema not found; error code: 40403

at io.confluent.kafka.schemaregistry.client.rest.RestService.sendHttpRequest(RestService.java:209)

at io.confluent.kafka.schemaregistry.client.rest.RestService.httpRequest(RestService.java:235)

at io.confluent.kafka.schemaregistry.client.rest.RestService.getId(RestService.java:415)

at io.confluent.kafka.schemaregistry.client.rest.RestService.getId(RestService.java:408)

at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.getSchemaByIdFromRegistry(CachedSchemaRegistryClient.java:123)

at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.getBySubjectAndId(CachedSchemaRegistryClient.java:190)

at io.confluent.kafka.schemaregistry.client.CachedSchemaRegistryClient.getById(CachedSchemaRegistryClient.java:169)

at io.confluent.kafka.serializers.AbstractKafkaAvroDeserializer.deserialize(AbstractKafkaAvroDeserializer.java:121)

at io.confluent.kafka.serializers.AbstractKafkaAvroDeserializer.deserializeWithSchemaAndVersion(AbstractKafkaAvroDeserializer.java:243)

at io.confluent.connect.avro.AvroConverter$Deserializer.deserialize(AvroConverter.java:134)

at io.confluent.connect.avro.AvroConverter.toConnectData(AvroConverter.java:85)

at org.apache.kafka.connect.runtime.WorkerSinkTask.lambda$convertAndTransformRecord$0(WorkerSinkTask.java:510)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:128)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:162)

at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:104)

at org.apache.kafka.connect.runtime.WorkerSinkTask.convertAndTransformRecord(WorkerSinkTask.java:510)

at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:490)

at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:321)

at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:225)

at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:193)

at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)

at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

对我们来说,这表明Kafka Connect正在读取消息,对AVRO进行解码,并尝试从架构注册表中获取ID为0的架构。显然,架构注册表中的架构ID始终> 0。

我们目前正试图在此处找出问题。看起来KSQL正在使用架构ID 0编码消息,但我们无法找到原因:/

感谢您的任何帮助!

BR,帕特里克

当我们通过KSQL创建AVRO消息并尝试使用Kafka Connect使用它们时,发生了一些奇怪的事情。上下文:源数据第三方提供者正在生成数据...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值