您的位置:首页 > 新闻 > 会展 > 佛山网站建设专业现状_嵌入式培训推荐_免费收录软文网站_网站怎么添加外链

佛山网站建设专业现状_嵌入式培训推荐_免费收录软文网站_网站怎么添加外链

2024/12/25 0:29:13 来源:https://blog.csdn.net/2301_80912559/article/details/144140293  浏览:    关键词:佛山网站建设专业现状_嵌入式培训推荐_免费收录软文网站_网站怎么添加外链
佛山网站建设专业现状_嵌入式培训推荐_免费收录软文网站_网站怎么添加外链

在任何分布式系统中,序列化都是扮演着一个重要的角色的。如果使用的序列化技术,在执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序的性能下降很多。所以,进行Spark性能优化的第一步,就是进行序列化的性能优化。

Spark 旨在便利性(允许您在操作中使用任何 Java 类型)和性能之间取得平衡。它提供了两个序列化库:

1. Java 序列化机制:

默认情况下,spark使用此种机制。

默认情况下,Spark使用Java自身的ObjectInputStream和ObjectOutputStream机制进行对象的序列化。而且Java序列化机制是提供了自定义序列化支持的,只要你实现Serializable接口即可实现自己的更高性能的序列化算法。Java序列化机制的速度比较慢,而且序列化后的数据占用的内存空间比较大。

2. Kryo 序列化机制:

Spark也支持使用Kryo类库来进行序列化。Kryo序列化机制比Java序列化机制更快,而且序列化后的数据占用的空间更小,通常比Java序列化的数据占用的空间要小10倍。Kryo序列化机制之所以不是默认序列化机制的原因是,有些类型它也不一定能够进行序列化;此外,如果你要得到最佳的性能,Kryo还要求你在Spark应用程序中,对所有你需要序列化的类型都进行注册

如何使用Kryo 序列化机制

3. kryo序列化关于主动注册和自动注册的问题:

3.1 自动注册:

如果你不显示注册类,kryo会尝试自动检测并注册需要序列化的类。这种自动注册机制可能会导致一些问题,比如加载一些不必要的类或增加启动时间。

自动注册的缺点是kryo可能会扫描所有的类路径,这可能导致性能下降,尤其是在类路径中有大量类的情况。

3.2 手动注册:

为了避免手动注册带来的问题,你可以手动注册需要序列化的类。手动注册可以确保只有必要的类会被加载,从而提高性能和减少内存使用。

手动注册类的方式是在SparkConf中设置spark.kryo.registionRequired为true,并提供一共注册类的列表。

4. 优化Kryo 类库的使用

1)优化缓存大小

如果注册的要序列化的自定义的类型,本身特别大,比如包含了超过100个field。那么就会导致要序列化的对象过大。此时就需要对Kryo本身进行优化。因为Kryo内部的缓存可能不够存放那么大的class对象。此时就需要调用SparkConf.set()方法,设置spark.kryoserializer.buffer.max参数的值,将其调大。

默认情况下它的值是64,就是说最大能缓存64M的对象,然后进行序列化。可以在必要时将其调大。

2)预先注册自定义类型

使用自定义类型时需要预先注册好要序列化的自定义的类。

在什么场景下使用Kryo 序列化类库?

1)从 Spark 2.0.0 开始,在内部使用 Kryo 序列化程序来对具有简单类型、简单类型数组或字符串类型的 RDD 进行shuffle。

2)在你的算子中使用了别人实现写的且没有实现Serializable,比如hadoop的Text。

3)算子函数使用到了外部的大对象情况。比如我们在外部自定义了一个Map对象,里面包含了100m的数据。然后,在算子函数里面,使用到了这个外部的大对象。此时用广播变量替代大对象。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com