为啥 MicroBatchReader 必须是可序列化的?任务不可序列化错误

Posted

技术标签:

【中文标题】为啥 MicroBatchReader 必须是可序列化的?任务不可序列化错误【英文标题】:Why must MicroBatchReader be Serializable? Task not serializable error为什么 MicroBatchReader 必须是可序列化的?任务不可序列化错误 【发布时间】:2018-06-01 19:43:53 【问题描述】:

我正在练习用 Java 实现我自己的 V2 自定义结构化流式源,它只是从套接字读取文本并将其解析为具有两个字段“field1”和“field2”的 JavaBean。

运行 SimpleQuery 时

StreamingQuery query = inStream.groupBy("field1").count().writeStream()
     .outputMode("complete")
     .format("console")
     .start();

我收到以下错误

org.apache.spark.SparkException: Task not serializable
...

Caused by java.io.NotSerializableException: CustomStreamSource.SocketSourceV2$SocketBatchReader

Serialization stack:
...

我有几个无法在我的自定义 SocketBatchReader 中序列化的实例变量,即 SocketThread。有没有办法解决?此外,源 socket batch reader implementation 似乎也没有实现 Serializable

【问题讨论】:

我目前也在尝试编写自己的结构化流媒体源。你是如何实现createMicroBatchReader 函数的? javadoc 建议从 hdfs 检查点等恢复。你能分享你的代码吗?如果你愿意,我可以再写一个问题。 我正在实现的套接字源是一个不可靠的接收器,因此它没有实现检查点。但是,一旦我得到一个可行的解决方案,我仍然会将代码上传到 github —— 仍然会遇到一些错误。 提前谢谢你...顺便说一句,我把我的问题写成一个额外的question,如果你能看看会很高兴。 【参考方案1】:

更新:我的班级结构是这样的

public class ... implements DataSourceV2, ... 
    private class ... implements MicroBatchReader 

    

将我的 MicroBatchReader 移到 DataSourceV2 之外对我有用。

public class ... implements DataSourceV2, ... 


private class ... implements MicroBatchReader 


【讨论】:

以上是关于为啥 MicroBatchReader 必须是可序列化的?任务不可序列化错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到的表达式必须是可修改的左值?

Spark Streaming:使用带有列修剪的 MicroBatchReader 的模式不匹配

为啥在这种情况下 Array 的元素是可选的?

为啥 UITableViewCell textLabel 属性是可选的?

为啥 UITextField.text 是可选的?

为啥数据和堆栈段是可执行的?