产生原因
引用了某类的成员变量或函数,并且相应的类没有做好序列化处理,引用了某类的成员函数或变量,则需对相应的类做好序列化处理
解决办法
方法1:声明为@transent
在map()算子中继承了的RichMapFunction的类,其中的由于对象都需要序列化,但是对于不能够实现的序列化接口的对象比如数据库连接对象SqlConnection(mySQL、Postgresql等)和GeomentyFactory对象等,自身不可以序列化的对象,则声明为@transent
再分为两点:
(1)对象在需要在map()中不停调用的时候,这时候需要在open()中序列化,这个跟设置的并发线程数有关系。比如设置并发parallel=10,则该对象被初始化10次,生成是个对象,分别被10个线程调用;
(2)假如对象只需要在在后期实用一次,比如数据库连接SqlConnection在加载一次缓存(一般是不变的缓存),则最好是放在该类的构造函数中初始化,执行1次;
方法2:声明为静态
对于像数据库连接对象SqlConnection等不可以序列化的对象,由于该对象是长连接不可变对象,可以声明为静态对象(类对象),JVM会将该对象放入永久代Perminate 中,实现Flink多线程共享并发访问;
同理,所有不可变的小对象(不可变缓存(如hashMap)是指小的缓存对象)都可以声明为静态对象,因此,此时不用对该对象声明为@transent而表明不可以序列化;