【大数据学习 | 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的数据。然后,在算子函数里面,使用到了这个外部的大对象。此时用广播变量替代大对象。

相关推荐
大大大大晴天7 小时前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术8 小时前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
掉头发的王富贵1 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
ClouGence3 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
大大大大晴天4 天前
Hudi技术内幕:RecordPayload到RecordMerger
大数据
SelectDB5 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
WhoAmI5 天前
MapReduce框架原理解析一:InputFormat
大数据·hadoop
WhoAmI5 天前
MapReduce框架原理解析三:OutputFormat
大数据·hadoop
WhoAmI5 天前
MapReduce框架原理解析二:Shuffle
大数据·hadoop