Spark性能调优篇四之使用Kryo进行序列化操作

        接着上一篇文章,今天介绍一下通过使用Kryo这个东东来进一步降低网络IO的传输量和内存的占用率。在介绍Kryo之前,接下来我们先来对比一下默认的序列化和Kryo方式的序列化的性能(其实就是序列化后数据的体积)。

默认的序列化:基于Java语言的Spark程序中,默认使用了ObjectInputStream和ObjectOutputStream对对象进行序列化操作的。这种默认序列化机制的好处在于,处理起来比较方便;不需要我们手动去做什么事情,只是在算子里面使用的变量,必须是实现Serializable接口的,可序列化即可。

Kryo方式的序列化:Spark支持了Kryo序列化类库,采用Kryo对数据进行序列化操作可以大大降低数据体积,官方给出的数据是采用Kryo进行序列化比采用Java默认的序列化方式,性能高出后者10倍(官方提供的数据,没有正式测试过)。

        通过以上的对比,相信大家都很期待使用Kryo对数据进行序列化操作。在使用Kryo之前,我们需要明白在那些地方可以充分发挥Kryo序列化的作用;否则,即使启动了该功能,但并不能提升Spark作业的运行速度。主要有三个地方;

1、算子函数中使用到的外部变量(例如上一篇提到的随机抽取数据的map)

2、持久化RDD时进行序列化,StorageLevel.MEMORY_ONLY_SER 

3、shuffle阶段

        明确了以上的一些问题之后,我们看看在项目中是怎么的使用的吧。其实很简单,通过使用JavaSparkContext对象启用Kryo对数据进行序列化

sc.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

sc.registerKryoClasses(new Class[]{CategorySortKey.class})      /*CategorySortKey是一个例子*/

总结:使用Kryo进行数据的序列化是不是很简单;本片文章内容较短,在Spark项目中使用这个特性进行作业的优化也能够提升一定的效率。大家可以试着将其运用到自己的项目中去。本文到这里基本接近尾声,后续还会不断更新关于Spark作业优化的一些其他方式,欢迎关注。

如需转载,请注明:

z小赵 Spark性能调优篇四之使用Kryo进行序列化操作

你可能感兴趣的:(Spark性能调优篇四之使用Kryo进行序列化操作)