【spark RDD】spark 之 Kryo高性能序列化框架

文章目录

    • 一. RDD序列化的原因
    • 二. Kryo序列化框架
    • 三. spark 配置 kryo 序列化
      • 1. 设定kryo序列化
      • 2. 注册序列化类(非必须,但是强烈建议做)
      • 3. 配置 spark.kryoserializer.buffer

一. RDD序列化的原因

Spark初始化工作是在Driver端进行的,而实际运行程序是在Executor端进行的,这就涉及到了跨进程通信,是需要序列化的。所以用户开发的关于RDD的map,flatMap,reduceByKey等transformation 操作(闭包)有如下执行过程:

  • 代码中对象在driver本地序列化
  • 对象序列化后传输到远程executor节点
  • 远程executor节点反序列化对象,最终在远程executor节点中执行。

在spark中4个地方用到了序列化:

  • 算子中用到了driver定义的外部变量时;
  • 将自定义的class作为RDD的数据类型时;
  • 使用可序列化的持久化策略的时候。比如:MEMORY_ONLY_SER,spark会将RDD中每个分区都序列化成一个大的字节数组;
  • shuffle。

 

二. Kryo序列化框架

官网地址: https://github.com/EsotericSoftware/kryo

Java的序列化能够序列化任何的类。但是比较重,序列化后对象的体积也比较大。

Spark出于性能的考虑,Spark2.0开始支持另外一种Kryo序列化机制。Kryo速度是Serializable的10倍。当RDD在Shuffle数据的时候,简单数据类型、数组和字符串类型已经在Spark内部使用Kryo来序列化。

 
spark使用Kryo序列化框架


public class Test02_Kryo {public static void main(String[] args) throws ClassNotFoundException {// 1.创建配置对象SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore")// 替换默认的序列化机制.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")// 注册需要使用 kryo 序列化的自定义类(非必须,但是强烈建议做)// 虽说该步不是必须要做的(不做Kryo仍然能够工作),但是如果不注册的话,//  Kryo会存储自定义类中用到的所有对象的类名全路径,这将会导致耗费大量内存。.registerKryoClasses(new Class[]{Class.forName("com.atguigu.bean.User")});// 2. 创建sparkContextJavaSparkContext sc = new JavaSparkContext(conf);// 3. 编写代码User zhangsan = new User("zhangsan", 13);User lisi = new User("lisi", 13);JavaRDD<User> userJavaRDD = sc.parallelize(Arrays.asList(zhangsan, lisi), 2);JavaRDD<User> mapRDD = userJavaRDD.map(new Function<User, User>() {@Overridepublic User call(User v1) throws Exception {return new User(v1.getName(), v1.getAge() + 1);}});mapRDD. collect().forEach(System.out::println);sc.stop();}
}public class User implements Serializable {private String name;private Integer age;
// getter 、setter、tostring
}

 

三. spark 配置 kryo 序列化

1. 设定kryo序列化

1.配置文件方式
可以在配置文件spark-default.conf中添加该配置项(全局生效)spark.serializer   org.apache.spark.serializer.KryoSerializer2.业务代码中配置
在业务代码中通过SparkConf进行配置(针对当前application生效)val spark = SparkSession.builder().master("local[*]").appName("test").getOrCreate()
val conf = new SparkConf
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")3.在spark-shell、spark-submit脚本中启动
可以在命令中加上--conf spark.serializer=org.apache.spark.serializer.KryoSerializer

 

2. 注册序列化类(非必须,但是强烈建议做)

......
conf.registerKryoClasses(Array(classOf[Test1], classOf[Test2]))
// 其中Test1.java 和 Test2.java 是自定义的类如果是scala类Test1(scala中的trait就相当于java中的接口):class Test1 extends Serializable {......
}

注意:虽说该步不是必须要做的(不做Kryo仍然能够工作),但是如果不注册的话,Kryo会存储自定义类中用到的所有对象的类名全路径,这将会导致耗费大量内存,耗费内存比使用java更大。

在这里插入图片描述

 

3. 配置 spark.kryoserializer.buffer

如果要被序列化的对象很大,可以将spark.kryoserializer.buffer (默认64k)设置的大些,使得其能够hold要序列化的最大的对象。

 

参考:
https://blog.51cto.com/u_12902538/3727315
尚硅谷2024spark教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696189.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA智慧工地管理系统源码,智慧工地扬如何实现对工地扬尘的实时监测

智慧工地扬尘监测系统概述 智慧工地扬尘监测系统是一种利用现代信息技术&#xff0c;如光电传感技术和无线传输技术&#xff0c;对工地扬尘污染进行实时监测和管理的高效工具。该系统的目的是为了保护环境&#xff0c;减少因建筑施工产生的扬尘对周边地区的影响&#xff0c;同…

2024生日快乐祝福HTNL源码修复版

源码介绍 2024生日快乐祝福HTNL源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTNL源码

C语言(指针)3

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【pandas】库中的apply(lambda function ,arix)

pandas.apply() 遍历DataFrame的元素&#xff08;一行或者一列数据&#xff09; 行遍历&#xff1a;axis 1 列遍历&#xff1a;axis 0 基础信息 pandas的apply()方法是用来调用一个lambda函数&#xff0c;让函数对数据对象具有批处理的特性。 pandas支持apply()调用…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…

两种方法合并3dtiles(分别使用js/java)

目录 前言&#xff1a; 需合并的json目录 aa/tileset.json bb/tileset.json cc/tileset.json dd/tileset.json ee/tileset.json js源码&#xff1a; 运行命令&#xff1a; 生成结果&#xff1a; java源码&#xff1a; Matrix.java ThreeDTilesJoin2.java pom文件…

YOLOv8+CLIP实现图文特征匹配

本文通过结合YOLOv8s的高效物体检测能力与CLIP的先进图像-文本匹配技术&#xff0c;展示了深度学习在处理和分析复杂多模态数据中的潜力。这种技术的应用不仅限于学术研究&#xff0c;还能广泛应用于工业、商业和日常技术产品中&#xff0c;以实现更智能的人机交互和信息处理。…

管仲发动的粮食战争令人惊醒

各种类型的战争&#xff0c;在中国春秋战国时代就已经包罗万象、炉火纯青了&#xff0c;第一仲父管仲无疑是其中最伟大的军事家之一。 时至今日&#xff0c;他留给人们的最大印象&#xff0c;应该是孔子那句话“微管仲&#xff0c;吾其被发左衽矣。” 也就是说&#xff0c;如果…

办公软件_EdrawMax 免安装版教程 (亿图图示综合图形图表设计软件)

前言 万兴亿图图示(Wondershare EdrawMax)是一款综合图形图表设计软件,Visio国产替代.亿图图示中文版(Edraw Max)是一款办公绘图软件的思维导图软件.无需任何绘图功底,即可轻松创建各类思维导图.亿图图示专家,提供大量事例和在线模板,用于创建流程图,信息图,组织结构图,科学教…

滴滴7分钟路程收1414元事件:软件测试工程师的反思与启示

近日&#xff0c;一名上海网友在滴滴小程序发现了一条2017年的未支付信息。订单详情为2公里左右的行程&#xff0c;7分钟的时长&#xff0c;却显示付款1414元。 此次事件在滴滴客服回复“正常&#xff0c;支付就行”后&#xff0c;发酵到了热搜上&#xff0c;对滴滴平台的信誉造…

数字化教学实验室软件系统

实验室作为科研和技术创新的重要基地&#xff0c;数字化教学实验室软件系统为实验教学带来了极大的便利和创新。因此盛元广通数字化实验室软件系统应运而生。不仅支持实验课程的全流程管理&#xff0c;还提供了丰富的功能和工具来支持教师的教学和学生的学习。支持实验课程的预…

最短路径[dijkstra算法]——视频讲解+JAVA实现

dijkstra算法逻辑&#xff1a; 想要理解floyd算法的实现逻辑&#xff0c;最形象的视频讲解是很有必要的。 这里小编极力推荐B站蓝不过海呀这个Up的视频讲解&#xff0c;讲的非常细节&#xff0c; 比自己去看一些什么算法导论效率要高的多&#xff0c;毕竟相较于文字&#xf…