Flink已注册ProtobufSerializer时TypeExtractor仍报错protobuf类问题
问题原因
- 该日志是Flink
TypeExtractor类型提取阶段输出的,早于序列化器注册逻辑生效。你调用fromCollection时显式传入了TimestampedMessage.class作为类型提示,Flink会首先尝试将该类识别为POJO类型,但Protobuf编译生成的Java类字段均带有_后缀,也没有符合POJO规范的公共setter/getter方法,因此POJO校验失败,输出该提示。 - 你注册的
ProtobufSerializer是Kryo序列化框架的序列化器,只有当Flink判定该类型为GenericType、降级使用Kryo序列化时才会生效。这个INFO日志只是告知你该类没有被识别为POJO,不代表你注册的序列化器没有生效,但走Kryo代理序列化的性能弱于原生Protobuf序列化,且存在序列化兼容风险。
解决方案
- 显式指定Protobuf专属类型信息(最推荐)
Flink官方提供了ProtobufTypeInformation专门处理Protobuf类的类型提取和序列化,直接将其传入fromCollection方法即可跳过POJO校验,直接使用原生Protobuf序列化,性能最优,也不会再输出该提示。
注:使用ProtobufTypeInformation需要先引入Flink对应版本的flink-protobuf依赖。
示例代码:
env.fromCollection(new EventsIter(), ProtobufTypeInformation.of(TimestampedMessage.class))
- 为Protobuf类添加
@TypeInfo注解
如果需要全局生效该类的序列化规则,可以在Protobuf类上添加@TypeInfo注解,指定对应的Protobuf类型信息工厂,后续Flink提取该类类型时会直接使用指定的序列化规则,不需要每次调用算子时显式传入类型信息。 - 忽略INFO日志(不推荐)
如果你确认Kryo代理的Protobuf序列化能满足你的业务需求,该日志仅为INFO级别不影响运行,可以直接忽略,代码也能正常执行。
内容的提问来源于stack exchange,提问作者flink182
相关产品推荐
相关产品推荐

