flink传输protobuf问题

57 阅读1分钟

为了便于管理传输的数据,博主这边的项目采用protobuf来进行数据的中转传输。但在使用flink进行传输的时候,自测始终报错,内容如下:

image.png

问题分析:

这个错误是一个 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
);