专栏首页简单聊聊SparkSpark性能调优篇四之使用Kryo进行序列化操作

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进行序列化操作

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark性能调优篇二之重构RDD架构及RDD持久化

    上一篇介绍了一些关于提交Spark任务参数的调优,本片文章来聊聊一个Spark作业中RDD的重构,以及一些复用的RDD持久化的常用策略。

    z小赵
  • Spark内核分析之Worker原理分析

            接着上篇的Schedule调度内容,本篇我们来看看Driver,Application向Worker发送launch以后到底发生了什么。先来看看...

    z小赵
  • Kafka系列第6篇:消息是如何在服务端存储与读取的,你真的知道吗?

    经过前 5 篇文章的介绍,估么着小伙伴们已经对消息生产和消费的流程应该有一个比较清晰的认识了。当然小伙伴们肯定也比较好奇,Kafka 能够处理千万级消息,那它的...

    z小赵
  • java:组播通讯示例

    在局域网内,组播通讯还是很有用处的,以下代码基于MulticastSocket类进一步封装更加方便的实现组播数据发送和组播数据接收功能。

    用户1148648
  • 10大高性能开发宝石,我要消灭一半程序员!

    这篇文章,我们循序渐进,从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进,串联起高性能开发十大必须掌握的核心技术。

    轩辕之风
  • 十大高性能开发

    我们循序渐进,从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进,串联起高性能开发十大必须掌握的核心技术。

    ios-lan
  • 单元测试框架系列教程6属性invocationCount、invocationTimeOut

    这篇我们来学习下@Test中另外两个属性invocationCount和invocationTimeOut,前面我介绍了timOut这个属性,知道是超时监控的功...

    凯哥Java
  • Elasticsearch 瞬间入门

    把大象放进冰箱共有几步? 1. 打开冰箱门 2. 把大象放进去 3. 关上冰箱门 Elasticsearch 非常容易学习,分为3步: 1. 把数据放进去 2...

    netkiller old
  • C++接口继承与实现继承的区别和选择

    《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现; ...

    Dabelv
  • Python 含参构造函数

    py3study

扫码关注云+社区

领取腾讯云代金券