当前位置: 首页 > article >正文

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


http://www.kler.cn/a/417915.html

相关文章:

  • Spring boot之BeanDefinition介绍
  • 【青牛科技】2K02 电动工具专用调速电路芯片描述
  • 【人工智能-科普】图神经网络(GNN):与传统神经网络的区别与优势
  • Web 端网站后台裁剪功能:提升图像管理效率的利器
  • 互联网基础
  • Java安全—原生反序列化重写方法链条分析触发类
  • 鸿蒙学习使用模拟器运行应用(开发篇)
  • 深度学习基础03_BP算法(下)过拟合和欠拟合
  • 工程设计与总承包行业数字化转型:现状洞察、挑战突围与前景展望
  • 基于Java Springboot学生信息管理系统
  • asyncio.ensure_future 与 asyncio.create_task:Python异步编程中的选择
  • 汉字笔画分割959张图片带注释的YOLO,COCO,VOC格式的数据集
  • Vue-指令-案例
  • java——Spring MVC的工作流程
  • Python 中的 Lxml 库与 XPath 用法
  • ARP表、MAC表、路由表的区别和各自作用
  • 为什么在PyTorch中需要添加批次维度
  • ElasticSearch通过es-head插件安装可视化及相关问题
  • 告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系
  • 基于VMware 的 deepin 系统 学习 安装 1Panel mysql redis
  • Elasticsearch数据冷热分离
  • IDEA全局设置-解决maven加载过慢的问题
  • 【经典】星空主题的注册界面HTML,CSS,JS
  • Java全栈开发:旅游网站设计与实现
  • C++类中多线程的编码方式
  • Java代码操作Zookeeper(使用 Apache Curator 库)