【问题标题】:SqlSessionTemplate is not serializable in flinkSqlSessionTemplate 在 flink 中不可序列化
【发布时间】:2021-03-21 06:47:59
【问题描述】:

我的 flink 应用程序在启动时抛出了这样的异常:

Exception in thread "main" org.apache.flink.api.common.InvalidProgramException: org.apache.ibatis.binding.MapperProxy@3fe8ad3f is not serializable. The object probably contains or references non serializable fields.
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:171)
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:146)
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:146)
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:146)
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:91)
    at org.apache.flink.streaming.api.environment.StreamExecutionEnvironment.clean(StreamExecutionEnvironment.java:1606)
    at org.apache.flink.streaming.api.datastream.DataStream.clean(DataStream.java:178)
    at org.apache.flink.streaming.api.datastream.DataStream.addSink(DataStream.java:1240)
    at com.pdd.service.koduck.realtime.flink.operators.baseLayer.PlanProcessor.afterProcess(PlanProcessor.java:90)
    at com.pdd.service.koduck.realtime.flink.operators.baseLayer.Processor.process(Processor.java:43)
    at com.pdd.service.koduck.realtime.flink.Runner.run(Runner.java:49)
    at com.pdd.service.koduck.realtime.flink.Main.main(Main.java:27)
Caused by: java.io.NotSerializableException: org.mybatis.spring.SqlSessionTemplate
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at org.apache.flink.util.InstantiationUtil.serializeObject(InstantiationUtil.java:576)
    at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:153)
    ... 11 more

我认为原因是我的一个 SinkFunction 引用了一个 Mybatis Mapper 对象,该对象引用了一个不可序列化的 SqlSessionTemplate。
这是我的接收器功能:

    public class MySinkFunction2<T> extends RichSinkFunction<List<PlanDailyTable.Row>> {
        private PlanDailyDtoMapper mapper;

        public MySinkFunction2(PlanDailyDtoMapper mapper) {
            this.mapper = mapper;
        }

        @Override
        public void invoke(List<PlanDailyTable.Row> value, Context context) throws Exception {
            mapper.insertMultiRow(value);
        }
    }

如何解决这个问题?需要帮助

【问题讨论】:

    标签: serialization apache-flink mybatis flink-streaming


    【解决方案1】:

    不用在构造函数中实例化Mapper对象,可以在sink的open方法中做到这一点,然后将Mapper做成transient

    Sink 的构造函数在 Flink 客户端被调用,Sink 必须被序列化并发送给任务管理器。而当作业开始时,每个任务管理器中都会调用一次 sink 的 open 方法。

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 1970-01-01
      • 2020-04-29
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2019-02-01
      相关资源
      最近更新 更多