java kryo 序列化_Kryo序列化
Spark序列化概述
在Spark的架构中,在网络中传递的或者缓存在内存、硬盘中的对象需要进行序列化操作,序列化的作用主要是利用时间换空间:
分发给Executor上的Task
需要缓存的RDD(前提是使用序列化方式缓存)
广播变量
Shuffle过程中的数据缓存
使用receiver方式接收的流数据缓存
算子函数中使用的外部变量
上面的六种数据,通过Java序列化(默认的序列化方式)形成一个二进制字节数组,大大减少了数据在内存、硬盘中占用的空间,减少了网络数据传输的开销,并且可以精确的推测内存使用情况,降低GC频率。
其好处很多,但是缺陷也很明显:
把数据序列化为字节数组、把字节数组反序列化为对象的操作,是会消耗CPU、延长作业时间的,从而降低了Spark的性能。 至少默认的Java序列化方式在这方面是不尽如人意的。Java序列化很灵活但性能较差,同时序列化后占用的字节数也较多。
所以官方也推荐尽量使用Kryo的序列化库(版本2)。官文介绍,Kryo序列化机制比Java序列化机制性能提高10倍左右,Spark之所以没有默认使用Kryo作为序列化类库,是因为它不支持所有对象的序列化,同时Kryo需要用户在使用前注册需要序列化的类型,不够方便。
相关配置参数
Property Name
Default
spark.serializer
org.apache.spark.serializer.JavaSerializer
spark.kryoserializer.buffer
64k
spark.kryoserializer.buffer.max
64m
spark.kryo.classesToRegister
none
spark.kryo.referenceTracking
true
spark.kryo.registrationRequired
false
spark.kryo.registrator
none
spark.kryo.unsafe
false
配置说明:
spark.serializer:序列化时用的类,需要申明为org.apache.spark.serializer.KryoSerializer。这个设置不仅控制各个worker节点之间的混洗数据序列化格式,同时还控制RDD存到磁盘上的序列化格式及广播变量的序列化格式。
spark.kryoserializer.buffer:每个Executor中的每个core对应着一个序列化buffer。如果你的对象很大,可能需要增大该配置项。其值不能超过spark.kryoserializer.buffer.max
spark.kryoserializer.buffer.max:允许使用序列化buffer的最大值
spark.kryo.classesToRegister:向Kryo注册自定义的的类型,类名间用逗号分隔
spark.kryo.referenceTracking:跟踪对同一个对象的引用情况,这对发现有循环引用或同一对象有多个副本的情况是很有用的。设置为false可以提高性能
spark.kryo.registrationRequired:是否需要在Kryo登记注册?如果为true,则序列化一个未注册的类时会抛出异常
spark.kryo.registrator:为Kryo设置这个类去注册你自定义的类。最后,如果你不注册需要序列化的自定义类型,Kryo也能工作,不过每一个对象实例的序列化结果都会包含一份完整的类名,这有点浪费空间
spark.kryo.unsafe:如果想更加提升性能,可以使用Kryo unsafe方式
Kryo使用
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");//设置序列化方式
conf.registerKryoClasses(new Class[]{_KryoBean.class});//注册使用kryo序列化的类
另外一种注册的方法
//实现一个KryoRegistrator注册类,在该类里面对自定义的序列化类进行注册,然后在conf里面配置该类
public class _KryoRegistor implements KryoRegistrator{
@Override
public void registerClasses(Kryo kryo) {
kryo.register(_KryoBean.class, new FieldSerializer<>(kryo, _KryoBean.class));
kryo.register(xxx.class, new FieldSerializer<>(kryo, xxx.class));
...
...
}
}
// 在conf配置如下
SparkSession spark = SparkSession.builder().appName("").master("local")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.kryo.registrator", _KryoRegistor.class.getName())
.getOrCreate();
java kryo 序列化_Kryo序列化相关推荐
- Java kryo/protobuf/protostuff序列化 or Json 性能对比
Java kryo/protobuf/protostuff序列化 or Json 性能对比 - 腾飞的鹰 - 博客园 对于一个java object的序列化,想测一下使用json和使用一般序列化工具, ...
- java protostuff 好处_Java 序列化框架性能对比(kryo、hessian、java、protostuff)
简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff-Ru ...
- java 序列化 protobuf_java序列化机制之protobuf(快速高效跨语言)
我们之前曾讲过java自带的一种序列化机制,但是这种机制效率太低,有很多缺点.因此也涌现出了很多优秀的系列化框架,比如说protobuf.protostuff.thrift.hession.kryo. ...
- fst java性能_高性能序列化框架FST
fst是完全兼容JDK序列化协议的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右. 首先引入pom de.ruedigermoeller fst 2.04 测试代码 pa ...
- java string 反序列化_java序列化和反序列化
引语: 平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的时候在拿出来使用就好了,并且对象的信息要和我们保存 时的信息一 ...
- Java中的对象序列化操作
文章目录 1 Java中的对象序列化操作 1 Java中的对象序列化操作 首先看一下对象序列化的操作步骤: 创建一个类,继承Serializable接口 创建对象 将对象写入文件 从文件读取对象信息 ...
- java Serializable和Externalizable序列化反序列化详解--转
一.什么是序列化? "对象序列化"(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字 ...
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- Java之什么是序列化以及为什么要序列化
http://blog.csdn.net/tlycherry/article/details/8986720 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字 ...
- Java中 byte[]数组序列化和fastjson序列化区别
Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...
最新文章
- Mac上小巧实用的GIF格式录屏软件 LICEcap
- 5G 产业链重要投资节点
- jpa vue管理系统_在JPA 2.1中使用@Convert正确完成映射枚举
- synchronized,ReentrantLock解决锁冲突,脏读的问题
- ElasticSearch插件demo
- 工作92:500错误
- 前端学习(2442):解决跨域问题
- 使用jquery打造一个动态的预览产品颜色效果
- 鸿蒙将至,安卓安否?
- UART协议概述与实现
- Linux命令解释之fdisk
- 《Flutter 从0到1构建大前端应用》读后感—第8章【持久化】
- 发明与实用新型专利了解
- 计算机考研408每日一题 day161
- 计算机中英文标点符号对照表,常用中文标点符号和键盘对照表.doc
- 域名证书是什么样子的_什么是网站域名证书
- uni-app实现文件管理器(Android)
- https证书存在错误该怎么解决
- 使markdown文档中的图片居中
- pandas 中.dropna()的用法