为了账号安全,请及时绑定邮箱和手机立即绑定

Spark/Java:不可序列化问题 - Kryo 序列化

Spark/Java:不可序列化问题 - Kryo 序列化

不负相思意 2022-07-06 09:53:25
我对 kryo 序列化缺少什么?Class1 和 Class3 不是 java 可序列化的类(没有默认构造函数,既不是 getter 也不是 setter)当我尝试在 Spark 内部“使用”从 Spark 上下文创建的实例时,我遇到了序列化问题,无论我是否将 Classe3 注册为 Kryo 类。工作正常:Dataset<Class1> ds = spark.createDataset(classes, Encoders.kryo(Class1.class));Dataset<String> df = df.map((MapFunction<Class1, String>) class1 -> class1.getName(), Encoders.STRING());df.show();Class3引起的序列化错误spark = SparkSession        .builder()        .master("local[*]")        .config(new SparkConf().registerKryoClasses(new Class[] {Class3.class}))        .appName("spark_test")        .getOrCreate();Class3 class3 = Class3.getInstance();Dataset<Class1> ds = spark.createDataset(classes, Encoders.kryo(Class1.class));Dataset<String> df = df.map((MapFunction<Class1, String>) class1 -> class1.getName() + "-" class3.getId(), Encoders.STRING());df.show();
查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

总结评论中发生的讨论以形成答案 - 当您尝试调用转换时,Spark 驱动程序必须为该转换中的代码创建一个闭包并将其发送给负责运行它的执行程序. 在您的情况下,代码行Class3 class3 = Class3.getInstance();是 Scala 对象的一部分,它包含 Spark 上下文的创建和使用以达到某些结果,即驱动程序应用程序。因此,当您尝试传递class3映射转换时,驱动程序正在尝试序列化封闭的 Scala 对象。除非您实现可序列化,否则此 scala 对象本身不可序列化,因此您遇到序列化问题。

Re:Kryo 序列化 - 因为您已经使用 Kryo 注册了 Class3,它将帮助您序列化 Class3 实例,但是它不会序列化具有 Class3 实例作为变量的 Composite 对象。

因此,如果您提取 的值,class3.getId()然后将其传递给您的地图转换,则不需要将 Class3 注册到 Kryo。

在您的示例中,我上面提到的包含 Scala 对象的示例与驱动程序应用程序相同。

希望这可以帮助。


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 51 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信