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

时间:2017-12-11 06:30:41

标签: apache-spark elasticsearch serialization kryo

这是我的代码:

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

问题:

  • 如何检查registrator是否有效?
  • 我按mvn test运行了火花会话。是否需要提交操作?

2 个答案:

答案 0 :(得分: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将在序列化未注册的类时抛出异常。

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

我希望这有帮助!

答案 1 :(得分:0)

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

原因

  

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

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