Java 在spark shell和scala jars中向Kryo注册复杂的scala类

Java 在spark shell和scala jars中向Kryo注册复杂的scala类,java,scala,apache-spark,serialization,kryo,Java,Scala,Apache Spark,Serialization,Kryo,我有一个新的spark 2.3.1应用程序。。。它在一段时间内运行良好,但现在随着数据量的增加而崩溃 原始错误是kryo序列化问题。。。com.esotericsoftware.kryo.KryoException:java.lang.NegativeArraySizeException失败时。最奇怪的是它不一致。。。如果我在相同的数据和非共享集群上运行相同的代码,它可能会失败,也可能不会失败,看起来完全是随机的 我将spark.kryoserializer.buffer.max从我的默认值25

我有一个新的spark 2.3.1应用程序。。。它在一段时间内运行良好,但现在随着数据量的增加而崩溃

原始错误是kryo序列化问题。。。com.esotericsoftware.kryo.KryoException:java.lang.NegativeArraySizeException失败时。最奇怪的是它不一致。。。如果我在相同的数据和非共享集群上运行相同的代码,它可能会失败,也可能不会失败,看起来完全是随机的

我将spark.kryoserializer.buffer.max从我的默认值256m增加到2047m,只是为了看看会发生什么,结果它失败了,出现了相同的错误。我还尝试将RDD中的并行性从每个执行器失败6倍提高到3倍,但没有成功

现在,我尝试在spark shell-conf spark.kryo.registrationRequired=true中运行代码片段,以查找在序列化时需要注册以缩小大小的所有类,然后将它们以增量方式添加到-conf'spark.kryo.classesToRegister=org.myOrg.MyClass1,在我找到它们之后,我会将它们移到jar conf.registerKryoClassesArrayclassOf[MyClass1],classOf[MyClass2]中

但是有一个我完全不知道如何注册。错误看起来像这样

Caused by: java.lang.IllegalArgumentException: Class is not registered: org.myOrg.MyClass[]
Note: To register this class use: kryo.register(org.myOrg.MyClass[].class);
我怀疑这是一个参数Iterable[MyClass]对于其他类,比如类MyOuterClassval mcs:Iterable[MyClass],但我尝试注册的所有东西都无法工作。我相信MyClass[]是一个java.lang.Array[MyClass],但我已经尝试注册了我能想到的数组、Iterable、[]等的每一个组合,但没有成功注册它

关于在spark shell的命令行启动和最终在代码中注册Iterable、List和TupleN的语法,有什么建议吗?最终我也会有一些非常嵌套的元组,但我还没有做到这一点

我能在stackoverflow中找到的最接近的结果在这里,但我也不能让它为我工作

提前谢谢

编辑

只是想澄清一下。。。成功注册MyClass后,我仍然收到一条错误消息“Class not registered:MyClass[],我无法确定[]到底是什么,也无法确定如何注册以消除这些问题。

如果您的类名是MyClass,请尝试注册[LMyClass

conf.registerKryoClassesArray Class.forName[LMyClass


它应该为MyClass加载并注册数组类

感谢您的响应!我可以使用ArrayclassOf[MyClass]成功注册大多数类,…并且工作正常。但是在MyClass成功注册后,我仍然会收到一个错误消息class not registered:MyClass[],我无法找出[]最后是指示或如何修复。另外,使用classOf[MyClass]和Class.forName[LMyClass;?注册之间有什么区别?我以前从未见过这种表示法。这很有效!!谢谢!!我看到数组的java类名有你给出的[LName]格式,但我真的不明白Class.forName是什么[LMyClass;与[MyClass]的classOf做的不同。任何澄清都很感激,但无论如何都感谢您的回答。