为什么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
将在序列化未注册的类时抛出异常。
我建议你阅读关于这个主题的其他答案:
- Save Spark Dataframe into Elasticsearch - Can’t handle type exception
- Cannot be cast to org.apache.spark.serializer.Serializer
我希望这有帮助 !
另一答案
实际上,Kryo注册工作。注册的类仍然不可序列化的原因是Kryo无法序列化某些组件。可能有误导的是日志没有显示原因。
的原因
即使我设置了错误的注册类,也没有警告/错误日志。
测试代码是否有一个构造函数,它调用Kryo无法序列化的类。
以上是关于为什么kryo注册不能在SparkSession中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apache Spark 中向 Kryo Serializer 注册类?