spark 序列化

版权声明:本文为博主原创文章,未经博主允许不得转载。违者必究,究也没用! https://blog.csdn.net/young_0609/article/details/84728012

数据序列化

    序列化在分布式应用中起到很重要的作用。那些会让对象序列化过程缓慢,或是会消耗大量字节存储的序列化格式会大大降低计算速率。通常这会用户在优化Spark应用程序中的第一件事。Spark旨在在便利(允许您使用您的操作中的任何Java类型)和性能之间实现平衡。它提供了下面两种序列化库:

  1. Java serialization:Spark默认使用Java的ObjectOutputStream框架来序列化对象,可以对任何实现了java.io.Serializable的任何类进行序列化。用户也可以通过继承来实现更紧密的序列化性能控制。
  2. Kryo serialization:Spark也可以使用Kryo库(version 2)来实现更快的对象序列化。Kryo比Java序列化更快、数据格式更紧凑,但不支持所有的Serializable类型。用户如果希望使用Kryo来获取更好的性能,需要先去注册应用程序中会使用到的类。

几乎所有的资料都显示kryo 序列化方式优于java自带的序列化方式,而且在spark2.*版本中都是默认采用kryo 序列化。

1.先给出定义:
    把对象转换为字节序列的过程称为对象的序列化。
    把字节序列恢复为对象的过程称为对象的反序列化。
通俗地说序列化就是把内存(jvm)中一个对象的状态通过网络传输,或者保存到磁盘上,反序列化与之相反。

2.spark中的序列化
那么对象以何种形式进行传输性能更好呢?
在spark2.0+版本的官方文档中提到:spark默认提供了两个序列化库:Java自身的序列化和Kryo序列化
官网的解释是:java序列化灵活,但是速度缓慢。Kryo序列化速度更快且更紧凑,但是支持的类型较少。
而且spark现在已经默认RDD在shuffle的时候对简单类型使用了Kryo序列化。

    用户可以在初始化任务时通过设定SparkConf中的conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")来切换序列化框架为Kryo。这里的序列化配置不仅可以对worker节点之间的shuffle数据起作用,还可以在将RDD序列化到disk上时起作用。Kryo不是默认序列化选择的唯一原因它要求了用户的注册行为,但是我们建议在所有网络密集型应用程序中使用它。从Spark2.0.0开始,我们在传输简单类型或是字符串类型的Shuffle RDD时会默认使用Kryo序列化。

    Spark自动对许多在Twitter chill库中的AllScalaRegistrar被覆盖的常用的Scala类注册了Kryo。

    注册用户自身的类到kryo时,可以使用registerKryoClasses方法:

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)

    Kryo的文档https://github.com/EsotericSoftware/kryo描述了更多进阶的注册选项,例如增加用户序列化代码等等。

    如果用户的对象很大,也需要去增加spark.kryoserializer.buffer配置项。这个值需要达到足以保存你将要序列化的最大的对象。

    最后,如果你不注册用户类,kryo也可以工作,但是它将会存储每个对象的全类名,会造成存储空间的浪费。


 

猜你喜欢

转载自blog.csdn.net/young_0609/article/details/84728012
今日推荐