Apache flink 如何调试Flink中的可序列化异常?

Apache flink 如何调试Flink中的可序列化异常?,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,我遇到了几个可序列化的异常,我在弗林克的互联网和文档上做了一些搜索;有一些著名的解决方案,如transient、extends Serializable等。每次异常的来源都非常清楚,但在我的例子中,我无法找到未序列化的确切位置 问:我应该如何调试这种异常? A.scala: class executor ( val sink: SinkFunction[List[String]] { def exe(): Unit = { xxx.....addSink(sinks)

我遇到了几个可序列化的异常,我在弗林克的互联网和文档上做了一些搜索;有一些著名的解决方案,如transient、extends Serializable等。每次异常的来源都非常清楚,但在我的例子中,我无法找到未序列化的确切位置

问:我应该如何调试这种异常?

A.scala:

class executor ( val sink: SinkFunction[List[String]] {
    def exe(): Unit = {
        xxx.....addSink(sinks)
    }
}
B.斯卡拉:

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
}
例外情况是:

函数的实现不可序列化。这个 对象可能包含或引用不可序列化的字段

我发现了两个可疑点:

  • StringSink
    的实例被传递到另一个文件中
  • StringSink
    类中,它使用静态变量
    stringList
    它的compagin对象

  • 我的第一个猜测是,您在StringSink中没有无参数构造函数

    POJO类型的规则 如果满足以下条件,Flink将数据类型识别为POJO类型(并允许“按名称”字段引用):

  • 该类是公共的和独立的(没有非静态的内部类)
  • 该类有一个公共的无参数构造函数
  • 类(和所有超类)中的所有非静态、非瞬态字段要么是公共的(和非最终的),要么有一个公共getter和setter方法,该方法遵循getter和setter的JavaBeans命名约定
  • 只需添加一个无参数构造函数,然后重试
    我也面临类似的问题。过去,找出哪些成员/对象不可序列化需要很长时间。异常日志并没有真正的帮助

    帮助我的是以下JVM选项,它支持异常跟踪中的更多细节

    启用此选项

    -Dsun.io.serialization.extendedDebugInfo=true

        class StringSink extends SinkFunction[List[String]] {
            public StringSink() {
            }
            
            @override def invoke(strs: List[String]): Unit = {
                // add strs into the variable "stringList" of the compagin object StringSink
            }
    }