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

标签 apache-flink flink-streaming flink-cep

我遇到了几个可序列化的异常,并且我在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.

我发现的两个可疑点:

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

最佳答案

我也遇到过类似的问题。过去需要很长时间才能找出哪些成员/对象不可序列化。异常日志并没有多大帮助。

对我有帮助的是以下 JVM 选项,它可以在异常跟踪中提供更多详细信息。

启用此选项...

-Dsun.io.serialization.extendedDebugInfo=true

关于apache-flink - 如何调试Flink中的可序列化异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945603/

相关文章:

java - Apache Flink CEP 如何检测事件是否在 x 秒内没有发生?

kubernetes - Apache Flink-作业部署期间重复的消息处理,以ActiveMQ作为源

apache-flink - 从 IDE 运行 Flink 时如何启动 Flink 作业管理器 Web 界面

java - Apache-Flink 快速入门 - 读取 CSV 文件错误 : Futures timed out after [10000 milliseconds]

apache-flink - 如何在Flink流中的空窗口上执行函数?

apache-flink - 在 Apache flink 中的节点之间共享数据集的最佳方式是什么?

java - flink - 使用 Dagger 注入(inject) - 不可序列化?

java - 如何仅允许单个连接(url/端口)从 flink 应用程序读取和写入

java - 使用Flink窗口和折叠功能,元素丢失?

apache-flink - 在不重启作业的情况下在 Apache Flink 中动态添加模式