Spark 2.x管理与开发-Spark Streaming-性能优化(三)使用高性能序列化类库

1.数据序列化概述

数据序列化就是将对象或者数据结构转换成特定的格式,使其可以在网络中传输,或者可以存在内存或文件中。

反序列化则是相反的操作,将对象从序列化的数据中还原出来。

数据序列化后的数据格式,可以是二进制,可以是xml,也可以是JSON等任何形式。

对象,数据序列化的重点在于数据的交换和传输。

在任何分布式系统中,序列化都是扮演一个重要的角色,如果使用的序列化技术操作很慢,或者序列化后数据量还是很大,会让分布式系统的应用程序性能下降。

所以,进行Spark性能优化的第一步,就是进行序列化的性能优化。

Spark自身默认会在一些地方对数据进行序列化,像Shuffle。

另外,如果我们使用了外部数据(例如:自定义类型),我们也会让其可序列化。

Spark本身对序列化的便捷性和性能进行了取舍和权衡。

Spark默认情况下,倾向于便捷性,使用了Java自身序列化机制,很方便使用。

但是,Java序列化机制性能不高,序列化速度比较慢,而且序列化后的数据比较大,比较占用内存空间。

2.优化的方式:使用的是Kryo类库

Spark支持使用Kryo序列化类库来进行序列化

比Java的序列化机制更快,而且占用的空间更小,比Java序列化的占用空间小10倍。

3.如何使用Kryo序列化机制

1)设置Spark conf

http://spark.apache.org/docs/2.1.0/configuration.html

 

spark 模型文件序列化 spark的序列化_序列化

spark.master            spark://5.6.7.8:7077

spark.executor.memory   4g

spark.eventLog.enabled  true

spark.serializer        org.apache.spark.serializer.KryoSerializer

2)使用kryo时,要求需要序列化的类,需要提前注册,这样才能获得高性能。

使用方法-举例:

 

spark 模型文件序列化 spark的序列化_序列化_02

这种方法牺牲了便捷性提高性能。

4.Kryo类库的优化

1)优化缓存的大小

如果注册的序列化的自定义类型本身特别大,比如包含了超过100个字段,就会导致序列化的对象过大。

此时需要对Kryo本身进行优化。因为Kryo本身内部缓存可能不能存放这么大的class对象。

需要设置配置文件:

spark.kryoserializer.buffer.max

64m

Maximum allowable size of Kryo serialization buffer. This must be larger than any object you attempt to serialize. Increase this if you get a "buffer limit exceeded" exception inside Kryo.

默认是64MB,将其调大即可。

2)预先注册自定义类型

 

spark 模型文件序列化 spark的序列化_spark 模型文件序列化_03

推荐预先注册要序列化的自定义类型(如上图)。