在集成测试中在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类?
还是完全不同的问题?
非常感谢您的帮助!
答案 0 :(得分:0)
如果flink-avro
不在类路径中,则可能会出现此问题。如果您仍在使用Avro,我会disable Kryo completely捕获更多细微的错误。
答案 1 :(得分:0)
我通过在流程函数中进行解析来使其工作。
我必须先将字符串解析为json,然后再解析为特定类的特定记录字段的记录类,该特定字段应最终出现在DataSink中。
json的解析现在在另一个ProcessFuncton中实现,并且现在可以使用。在我将映射中的解析直接应用于DataStream之前。