为什么kryo注册不能在SparkSession中工作?

问题描述 投票:1回答:2

这是我的代码:

public static SparkSession getTestSparkSession(String name) {
    SparkConf conf = new SparkConf()
            .set("spark.master", "local")
            .set("spark.ui.port", "8040")
            .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
            .set("spark.kryo.registrator", "com.test.MyKryoRegistrator");
    return SparkSession.builder()
            .appName(name)
            .config(conf)
            .getOrCreate();
}

但似乎寄存器不起作用:

  • 我在registrator中注册的类仍然不可序列化。
  • 即使我设置了错误的注册类,也没有警告/错误日志。
  • 我将日志级别设置为DEBUG,并且发现只有一个关于kryo的行日志:DEBUG SparkEnv:58 Using serializer: class org.apache.spark.serializer.KryoSerializer

问题:

  • 如何检查registrator是否有效?
  • 我正在运行mvn test的火花会议。是否需要提交操作?
apache-spark elasticsearch serialization kryo
2个回答
2
投票

如果您想验证Spark是否考虑了您的配置,您可以只要求Spark为您提供管理员的配置。

你只需要从SparkContext获取底层的SparkSession并调用getConf函数,如下所示:

sparkContext.getConf.get("spark.kryo.registrator") // (this is in scala)

否则,您始终可以检查Spark UI。

现在,如果你想强制注册,你需要将spark.kryo.registrationRequired设置为true。 (但是你需要手动处理大量的东西)

该参数的默认情况设置为false,因此Kryo将写入未注册的类名以及每个对象。编写类名会导致显着的性能开销,因此启用此选项可以严格执行用户未从注册中省略的类。

另一方面,如果将其设置为“true”,则Kryo将在序列化未注册的类时抛出异常。

我建议你阅读关于这个主题的其他答案:

我希望这有帮助 !


0
投票

实际上,Kryo注册工作。注册的类仍然不可序列化的原因是Kryo无法序列化某些组件。可能有误导的是日志没有显示原因。

的原因

即使我设置了错误的注册类,也没有警告/错误日志。

测试代码是否有一个构造函数,它调用Kryo无法序列化的类。

© www.soinside.com 2019 - 2024. All rights reserved.