美文网首页Spark 应用大数据玩转大数据
Spark性能调优篇四之使用Kryo进行序列化操作

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

作者: z小赵 | 来源:发表于2017-11-13 11:34 被阅读61次

            接着上一篇文章,今天介绍一下通过使用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进行序列化操作

        本文链接:https://www.haomeiwen.com/subject/odwamxtx.html