首页 理论教育 Spark数据序列化:Java序列化与Kryo

Spark数据序列化:Java序列化与Kryo

时间:2023-06-20 理论教育 版权反馈
【摘要】:很多情况下,这是我们优化Spark应用的第一选择。Spark试图在方便和性能之间获取一个平衡。Spark提供了两个序列化类库:Java序列化:在默认情况下,Spark采用Java的ObjectOutputStream序列化一个对象。通过继承java.io.Externalizable,你能进一步控制序列化的性能。Java序列化非常灵活,但是速度较慢,在某些情况下序列化的结果也比较大。我们可以在创建SparkContext之前,通过调用System.setProperty,将序列化方式切换成Kryo。该属性的默认值是32,但是该属性需要足够大以便能够容纳需要序列化的最大对象。

Spark数据序列化:Java序列化与Kryo

序列化对于提高分布式程序的性能起到非常重要的作用。一个不好的序列化方式(如序列化模式的速度非常慢或者序列化结果非常大)会极大降低计算速度。很多情况下,这是我们优化Spark应用的第一选择。Spark试图在方便和性能之间获取一个平衡。Spark提供了两个序列化类库:

(1)Java序列化:在默认情况下,Spark采用Java的ObjectOutputStream序列化一个对象。该方式适用于所有实现了java.io.Serializable的类。通过继承java.io.Externalizable,你能进一步控制序列化的性能。Java序列化非常灵活,但是速度较慢,在某些情况下序列化的结果也比较大。

(2)Kryo序列化:Spark也能使用Kryo序列化对象。Kryo不但速度极快,而且产生的结果更为紧凑。Kryo的缺点是不支持所有类型,为了更好的性能,你需要提前注册程序中所使用的类。

我们可以在创建SparkContext之前,通过调用System.setProperty("spark.serializer","spark.KryoSerializer"),将序列化方式切换成Kryo。Kryo不能成为默认方式的唯一原因是需要用户进行注册,但是,对于任何“网络密集型”(network-intensive)的应用,都建议采用该方式。(www.xing528.com)

最后,为了将类注册到Kryo,需要继承spark.KryoRegistrator并且设置系统属性spark.kryo.registrator指向该类,如下所示。

Kryo序列化器的文档描述了很多便于注册的高级选项,例如添加用户自定义的序列化代码。如果对象非常大,我们还需要增加属性spark.kryoserializer.buffer.mb的值。该属性的默认值是32,但是该属性需要足够大以便能够容纳需要序列化的最大对象。最后,如果不注册自己定义的类,Kryo仍然可以工作,但是需要为了每一个对象保存其对应的全类名(full class name),这是非常浪费的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈