这是我的代码:
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();
}
但似乎寄存器不起作用:
DEBUG SparkEnv:58 Using serializer: class org.apache.spark.serializer.KryoSerializer
。问题:
mvn test
运行了火花会话。是否需要提交操作?答案 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无法序列化的类。