栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Flink - The object probably contains or references non serializable fields 无法序列化问题

Flink - The object probably contains or references non serializable fields 无法序列化问题

一.引言

使用 Flink 自定义 Source 生成数据时,集群提交任务时显示 org.apache.log4j.Logger@72c927f1 is not serializable. The object probably contains or references non serializable fields. 报错序列化相关错误 :

二.问题解决 1.Scala

错误代码:

val logger = Logger.getLogger(classOf[T])

正确代码:

通过 scala 延迟加载功能与 @transient 关键字忽略对该变量的序列化,前提是该变量在对应 class[T] 初始化时不需要,如果某个变量在 class[T] 初始化时调用,加了 @transient 关键字会导致该变量为 null 并报错空指针。

  @transient lazy val logger = Logger.getLogger(classOf[T])

2.Java

错误代码:

private Logger logger =   Logger.getLogger(T.class)

正确代码:

log4j 不能序列化,为了防止 logger 被序列化,需要保持其处于 @transient 或者 static 状态,前者会导致上述相同的问题即 NullPointException,所以这里通过 static + final 修饰。

private static final Logger logger = Logger.getLogger(T.class)

三.扩展

上述错误发生在 class[T] 内的变量 logger,变量无法序列化通过上述方法即可解决,如果是 class[T] 内某个 class 无法序列化,则需要实现 java.io.Serializable 接口,保证该类可以被序列化。上面的序列化问题出现在 BroadcastStream 场景下,由于 broadcastStream 中的类T 中有变量无法序列化导致广播流失效,通过 scala 方法已完美解决。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号