您好,登录后才能下订单哦!
小编给大家分享一下Spark中如何以序列化方式调优,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
在任何分布式应用中序列化都扮演者一个重要的角色。序列化过程非常慢的或者消耗大量字节的序列化格式,都是会巨大的减缓计算速度。通常这是优化spark应用程序的第一件事情。Spark目标是在你的操作中直接便利的使用java类型和性能找到一个平衡点。目前,spark提供两种序列化的库:
1.Java serialization:默认情况下,spark使用Java的 ObjectOutputStream框架,序列化对象。可以应用于任何继承了java.io.Serializable的自创建类。你也可以通过更密切的继承java.io.Externalizable,来控制你自己的序列化方式的性能。JAVA的序列化虽然灵活,但是通常是非常慢的,同时针对很多类会导致大的序列化格式。
2.Kryo serialization:Spark也可以用 Kryo library (version 2) 来加速序列化。Kryo比java序列化更快,更紧凑(往往搞出10倍),但是并不支持所有的序列化类型,为了达到最佳的性能需要提前注册你在你的程序中使用的类。
你可以通过使用SparkConf更改spark的序列化方式。这个设置不仅影响到worker间传输的Shuffle数据也会序列化准备写到磁盘的RDD。Kryo不是默认序列化方式的主要原因是需要自定义注册。我们建议使用它在任何网络密集型应用程序中。
Spark会自动的包括Kryo,针对大多数通用的scala类。
向Kryo注册你的类,可以通过registerKryoClasses 方法
val conf = new SparkConf().setMaster(...).setAppName(...)
conf.registerKryoClasses(Array(classOf[MyClass1], classOf[MyClass2]))
val sc = new SparkContext(conf)
https://github.com/EsotericSoftware/kryo 链接文档描述了更先进的kryo注册选项,如添加自定义序列化代码。
如果你的对象非常大,你需要增加spark.kryoserializer.buffer。这个值要大于你要序列化的最大的对象。
最后,如果不向Kyro注册你的自定义类型,Kyro也会继续工作,但是他会保存你每个对象的类全名,这非常浪费。
关于spark对Kyro的配置的支持,请参考。
http://spark.apache.org/docs/1.6.0/configuration.html#compression-and-serialization
以上是“Spark中如何以序列化方式调优”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。