在Flink Mini Cluster(1.11)和AvroKryoSerializerUtils上运行流不起作用

时间:2020-09-25 14:38:11

标签: apache-flink

在集成测试中在flink mini集群上测试流时遇到问题。 该流将映射生成的Avro SpecificRecord Pojo类(Java)。

流作业是用Scala编写的。

flink运行时崩溃,因为它无法实例化org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils

这是堆栈跟踪:

stack: java.lang.ClassCastException: class org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils
java.lang.RuntimeException: Could not instantiate org.apache.flink.formats.avro.utils.AvroKryoSerializerUtils.
    at org.apache.flink.api.java.typeutils.AvroUtils.getAvroUtils(AvroUtils.java:53)
    at org.apache.flink.api.java.typeutils.runtime.kryo.KryoSerializer.buildKryoRegistrations(KryoSerializer.java:572)

我认为问题在于Flink无法序列化Avro Pojo类,因为该类中有多个嵌套的Avro Pojo类。

我试图为所有嵌套的Pojo类类型添加所有类型信息,但仍然遇到相同的问题。

所以现在我想知道是否有人用嵌套的Avro Pojo类生成的Avro Pojo类来进行Flink Job。所有类均继承类型SpecificRecord并从avro模式生成。

是否需要编写某种特殊的序列化程序?是否有任何文档或示例适用于这样的序列化程序,该序列化程序可处理Scala或Java中的多个嵌套Pojo类?

还是完全不同的问题?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果flink-avro不在类路径中,则可能会出现此问题。如果您仍在使用Avro,我会disable Kryo completely捕获更多细微的错误。

答案 1 :(得分:0)

我通过在流程函数中进行解析来使其工作。

我必须先将字符串解析为json,然后再解析为特定类的特定记录字段的记录类,该特定字段应最终出现在DataSink中。

json的解析现在在另一个ProcessFuncton中实现,并且现在可以使用。在我将映射中的解析直接应用于DataStream之前。