我用这个打开了kryo连载:
conf.set( "spark.serializer", "org.apache.spark.serializer.KryoSerializer" )
我希望确保当在节点之间洗牌时,使用kryo对自定义类进行序列化。我可以通过以下方式向kryo注册该类:
conf.registerKryoClasses(Array(classOf[Foo]))
conf.set("spark.kryo.registrationRequired", "true")
但这会导致IllegalArugmentException被抛出(“class未注册”),用于我假设Spark在内部使用的一系列不同类,例如:
org.apache.spark.util.collection.CompactBuffer
scala.Tuple3
当然,我不必用Kryo手动注册这些单独的类?这些序列化程序都是在kryo中定义的,那么有没有一种方法可以自动注册所有的序列化程序呢?
按照我的理解,这实际上并不能保证使用kyro序列化;如果序列化程序不可用,kryo将回到Java序列化。
如果将spark.serializer
设置为org.apache.spark.serializer。kryoserializer
,然后Spark将使用kryo。如果Kryo不可用,您将得到一个错误。没有退路。
那么这个Kryo注册是什么呢?
conf.set("spark.kryo.registrationRequired", "true")
触发寄存器的类列表实际上包括CompactBuffer
,因此如果您看到错误,那么您做错了什么。您正在绕过Spark注册程序。您必须使用spark.kryo.classestoRegister
或spark.kryo.registrator
注册类。(请参见配置选项。如果使用GraphX,您的registrator应该调用GraphxUtils.RegisterKryOClasses。)
我在程序中使用,需要序列化内核以便以后重用它们。 为此,我使用: 如何定义必须使用?
我有一个类,它通过实现中的和方法来实现自定义Kryo序列化程序(请参见下面的示例)。如何用Spark注册此自定义序列化程序? 现在在Spark: 不幸的是,Spark没有给我注册自定义序列化程序的选项。你知道有没有办法做到这一点?
我已经看到Beam Spark runner使用BeamSparkRunnerRegistrator进行kryo注册。有没有办法注册自定义用户类?
要强制spark使用kryo序列化,可以设置以下选项。克鲁约。需要注册。 如何注册组织。阿帕奇。火花sql。类型。数据类型[]? 这是抛出异常。但是尝试像这样注册将不会编译
我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。
我得到以下错误:org.apache.spark.sql.analysisException:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;; 我尝试了多种解决方案来解决这个问题,但似乎没有任何效果。所有的想法都得到了赞赏。谢了!