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

我对 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();


不负相思意
浏览 52回答 1
1回答

摇曳的蔷薇

总结评论中发生的讨论以形成答案 - 当您尝试调用转换时,Spark 驱动程序必须为该转换中的代码创建一个闭包并将其发送给负责运行它的执行程序.&nbsp;在您的情况下,代码行Class3 class3 = Class3.getInstance();是 Scala 对象的一部分,它包含 Spark 上下文的创建和使用以达到某些结果,即驱动程序应用程序。因此,当您尝试传递class3映射转换时,驱动程序正在尝试序列化封闭的 Scala 对象。除非您实现可序列化,否则此 scala 对象本身不可序列化,因此您遇到序列化问题。Re:Kryo 序列化 - 因为您已经使用 Kryo 注册了 Class3,它将帮助您序列化 Class3 实例,但是它不会序列化具有 Class3 实例作为变量的 Composite 对象。因此,如果您提取 的值,class3.getId()然后将其传递给您的地图转换,则不需要将 Class3 注册到 Kryo。在您的示例中,我上面提到的包含 Scala 对象的示例与驱动程序应用程序相同。希望这可以帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java