【大数据学习 | Spark调优篇】数据序列化(kryo序列化)

在任何分布式系统中,序列化都是扮演着一个重要的角色的。如果使用的序列化技术,在执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序的性能下降很多。所以,进行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的数据。然后,在算子函数里面,使用到了这个外部的大对象。此时用广播变量替代大对象。

相关推荐
阿里云大数据AI技术8 分钟前
MaxCompute聚簇优化推荐功能发布,单日节省2PB Shuffle、7000+CU!
大数据
未来之窗软件服务3 小时前
数据库优化提速(一)之进销存库存管理—仙盟创梦IDE
数据库·sql·数据库调优
Lx3524 小时前
Hadoop小文件处理难题:合并与优化的最佳实践
大数据·hadoop
激昂网络4 小时前
android kernel代码 common-android13-5.15 下载 编译
android·大数据·elasticsearch
绝缘体14 小时前
折扣大牌点餐api接口对接适合本地生活吗?
大数据·网络·搜索引擎·pygame
君不见,青丝成雪5 小时前
浅看架构理论(二)
大数据·架构
武子康5 小时前
大数据-74 Kafka 核心机制揭秘:副本同步、控制器选举与可靠性保障
大数据·后端·kafka
MrZhangBaby6 小时前
SQL-leetcode—3374. 首字母大写 II
linux·sql·leetcode
Java小白程序员7 小时前
SQL 语句进阶实战:从基础查询到性能优化全指南
数据库·sql·性能优化