为了便于管理传输的数据,博主这边的项目采用protobuf来进行数据的中转传输。但在使用flink进行传输的时候,自测始终报错,内容如下:
问题分析:
这个错误是一个 Flink 作业执行失败的问题,具体错误发生在 Kryo 序列化过程中
在序列化 com.gdt.proto.AllBehaviorDataProtos(定义的pb)的时候,某些字段为空,导致序列化失败
可能的原因:
● Protobuf 对象内部使用特殊的数据结构(如 ByteString、RepeatedField),Kryo 默认序列化器无法正确处理它们
● Protobuf 对象在序列化时会检查字段是否已设置(hasField()),而 Kryo 默认序列化方式可能错误地调用这些方法,导致 NPE
解决方案:
对于 Protobuf 对象,Flink 会默认走 Kryo 路径,但 Kryo 并不了解 Protobuf 的内部机制,容易出错。
可以使用ProtobufSerializer。这是专为 Protobuf 定制的序列化器,可以直接用 Protobuf 的高效二进制方式序列化和反序列化对象。
导入依赖:
<dependency>
<groupId>com.twitter</groupId>
<artifactId>chill-protobuf</artifactId>
<version>0.10.0</version>
</dependency>
代码:
在代码的env环境里,进行如下配置:
env.getConfig().registerTypeWithKryoSerializer(
xxx.class,
com.twitter.chill.protobuf.ProtobufSerializer.class
);