我在不同的服务上有一个 kafka 生产者和消费者,消费者代码已推出并且工作正常,然后今天我推出了生产者端更改并在消费者上获得序列化异常。我使用融合的 AVRO 模式注册表服务器,直到今天它也一直运行良好。
org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id 59
Caused by: java.lang.ClassCastException: class org.apache.avro.util.Utf8 cannot be cast to class java.lang.String (org.apache.avro.util.Utf8 is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @77bd7fe7; java.lang.String is in module java.base of loader 'bootstrap')
at com.mydev.ret.lib.avro.mark.put(Mark.java:132)
作为此过程的一部分,架构已更改,但这并不是第一次发生这种情况,重要的是我们在迁移到 avro 1.9.1 和 kafka-avro-serializer-6.0.0 后
任何想法,看到字符串和 UTF 问题让我觉得生产者和消费者之间可能存在工件不匹配。
当将 DataStream 转换为 Table 时,我在 Flink 中遇到了类似的错误。在互联网上搜索发现这个问题尚未得到解答,但是@mrmannione 在他的评论中建议添加
<stringType>String</stringType>
它解决了我的问题,所以我将其留在这里供其他人使用 pom.xml 中的使用示例
<build>
<plugins>
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.10.2</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>${project.basedir}/src/main/resources/schema</sourceDirectory>
<outputDirectory>target/generated-sources/</outputDirectory>
<stringType>String</stringType>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>