在Beam Spark runner中注册Kryo序列化的自定义类

时间:2017-08-16 16:41:39

标签: apache-spark apache-beam

我看到Beam Spark跑步者使用BeamSparkRunnerRegistrator进行kryo注册。有没有办法注册自定义用户类?

3 个答案:

答案 0 :(得分:1)

有一种方法可以这样做,但首先,请问您为什么要这样做?

一般来说,Beam的Spark运行程序使用Beam编码器来序列化用户数据。

我们目前有一个错误,其中使用Kryo序列化了缓存的DStream,如果用户类不是Kryo可序列化,则会失败。 BEAM-2669。我们目前正在尝试解决此问题。

如果这是您面临的问题,您现在可以使用Kryo的registrator解决此问题。这是你面临的问题吗?或者你有不同的理由这样做,请告诉我。

无论如何,以下是使用JavaSparkContext

向Beam的Spark运动员提供自定义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);

有关详细信息,请参阅:

Beam Spark runner documentation

Example: ProvidedSparkContextTest.java

答案 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序列化仍然可以使用,但必须将完整的类名与每个对象一起存储,这很浪费。