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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么kryo注册不能在SparkSession中工作?相关的知识,希望对你有一定的参考价值。

这是我的代码:

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的火花会议。是否需要提交操作?
答案

如果您想验证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将在序列化未注册的类时抛出异常。

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

我希望这有帮助 !

另一答案

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

的原因

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

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

以上是关于为什么kryo注册不能在SparkSession中工作?的主要内容,如果未能解决你的问题,请参考以下文章

Kryo序列化:Class Not Found的可能原因

Kryo序列化器(快速上手)

如何在 Apache Spark 中向 Kryo Serializer 注册类?

在spark-shell和Scala jars中用Kryo注册复杂的scala类。

在 sparkSession 上注册两个同名 udf

我们不能在 map 函数中使用 sparkContext 吗?