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.master spark://5.6.7.8:7077 spark.executor.memory 4g spark.eventLog.enabled true spark.serializer org.apache.spark.serializer.KryoSerializer |
2)使用kryo时,要求需要序列化的类,需要提前注册,这样才能获得高性能。
使用方法-举例:
这种方法牺牲了便捷性提高性能。
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)预先注册自定义类型
推荐预先注册要序列化的自定义类型(如上图)。