我看到Beam Spark跑步者使用BeamSparkRunnerRegistrator
进行kryo注册。有没有办法注册自定义用户类?
答案 0 :(得分:1)
有一种方法可以这样做,但首先,请问您为什么要这样做?
一般来说,Beam的Spark运行程序使用Beam编码器来序列化用户数据。
我们目前有一个错误,其中使用Kryo序列化了缓存的DStream
,如果用户类不是Kryo可序列化,则会失败。 BEAM-2669。我们目前正在尝试解决此问题。
如果这是您面临的问题,您现在可以使用Kryo的registrator解决此问题。这是你面临的问题吗?或者你有不同的理由这样做,请告诉我。
无论如何,以下是使用JavaSparkContext
SparkContextOptions
实例的方法
SparkConf conf = new SparkConf();
conf.set("spark.serializer", KryoSerializer.class.getName());
conf.set("spark.kryo.registrator", "my.custom.KryoRegistrator");
JavaSparkContext jsc = new JavaSparkContext(..., conf);
SparkContextOptions options = PipelineOptionsFactory.as(SparkContextOptions.class);
options.setRunner(SparkRunner.class);
options.setUsesProvidedSparkContext(true);
options.setProvidedSparkContext(jsc);
Pipeline p = Pipeline.create(options);
有关详细信息,请参阅:
答案 1 :(得分:0)
使用此自定义序列化程序
创建您自己的KryoRegistrator
package Mypackage
class MyRegistrator extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classOf[A], new CustomASerializer())
}}
然后,使用您的registrator的完全限定名称添加有关它的配置条目,例如Mypackage.MyRegistrator:
val conf = new SparkConf()
conf.set("spark.kryo.registrator", "Mypackage.KryoRegistrator")
请参阅文档:Data Serialization Spark
答案 2 :(得分:0)
如果您不想注册您的类,Kryo序列化仍然可以使用,但必须将完整的类名与每个对象一起存储,这很浪费。