我遇到了几个可序列化的异常,并且我在Flink的互联网和文档上进行了一些搜索;有一些著名的解决方案,如 transient 、扩展序列化等。每次异常的起源都非常清楚,但就我而言,我无法找到它到底在哪里没有序列化。
问:如何调试这种异常?
A.scala:
class executor ( val sink: SinkFunction[List[String]] {
def exe(): Unit = {
xxx.....addSink(sinks)
}
}
B.scala:
class Main extends App {
def createSink: SinkFunction[List[String]] = new StringSink()
object StringSink {
// static
val stringList: List[String] = List()
}
// create a testing sink
class StringSink extends SinkFunction[List[String]] {
override def invoke(strs: List[String]): Unit = {
// add strs into the variable "stringList" of the compagin object StringSink
}
}
new executor(createSink()).exe()
// then do somethings with the strings
}
异常(exception)情况是:
The implementation of the SinkFunction is not serializable. The object probably contains or references non serializable fields.
我发现的两个可疑点:
StringSink
的实例被传递到另一个文件中。- 在
StringSink
类中,它使用了一个静态变量stringList
它的 compagin 对象。
最佳答案
我也遇到过类似的问题。过去需要很长时间才能找出哪些成员/对象不可序列化。异常日志并没有多大帮助。
对我有帮助的是以下 JVM 选项,它可以在异常跟踪中提供更多详细信息。
启用此选项...
-Dsun.io.serialization.extendedDebugInfo=true
关于apache-flink - 如何调试Flink中的可序列化异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945603/