为啥 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 中序列化的实例变量,即 Socket
和 Thread
。有没有办法解决?此外,源 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 的模式不匹配