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序列化相关推荐

  1. Java kryo/protobuf/protostuff序列化 or Json 性能对比

    Java kryo/protobuf/protostuff序列化 or Json 性能对比 - 腾飞的鹰 - 博客园 对于一个java object的序列化,想测一下使用json和使用一般序列化工具, ...

  2. java protostuff 好处_Java 序列化框架性能对比(kryo、hessian、java、protostuff)

    简介: 优点 缺点 Kryo 速度快,序列化后体积小 跨语言支持较复杂 Hessian 默认支持跨语言 较慢 Protostuff 速度快,基于protobuf 需静态编译 Protostuff-Ru ...

  3. java 序列化 protobuf_java序列化机制之protobuf(快速高效跨语言)

    我们之前曾讲过java自带的一种序列化机制,但是这种机制效率太低,有很多缺点.因此也涌现出了很多优秀的系列化框架,比如说protobuf.protostuff.thrift.hession.kryo. ...

  4. fst java性能_高性能序列化框架FST

    fst是完全兼容JDK序列化协议的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右. 首先引入pom de.ruedigermoeller fst 2.04 测试代码 pa ...

  5. java string 反序列化_java序列化和反序列化

    引语: 平时我们在运行程序的时候,创建的对象都在内存中,当程序停止或者中断了,对象也就不复存在了.如果我们能将对象保存起来,在需要使用它的时候在拿出来使用就好了,并且对象的信息要和我们保存 时的信息一 ...

  6. Java中的对象序列化操作

    文章目录 1 Java中的对象序列化操作 1 Java中的对象序列化操作 首先看一下对象序列化的操作步骤: 创建一个类,继承Serializable接口 创建对象 将对象写入文件 从文件读取对象信息 ...

  7. java Serializable和Externalizable序列化反序列化详解--转

    一.什么是序列化?   "对象序列化"(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字 ...

  8. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  9. Java之什么是序列化以及为什么要序列化

    http://blog.csdn.net/tlycherry/article/details/8986720  序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字 ...

  10. Java中 byte[]数组序列化和fastjson序列化区别

    Java中 byte[]数组序列化和fastjson序列化区别 Java中,对于对象可以通过序列化成byte数组或者序列化成json形式,这里做下两者的对比. 首先看下实现方式: 1 byte数组序列 ...

最新文章

  1. Mac上小巧实用的GIF格式录屏软件 LICEcap
  2. 5G 产业链重要投资节点
  3. jpa vue管理系统_在JPA 2.1中使用@Convert正确完成映射枚举
  4. synchronized,ReentrantLock解决锁冲突,脏读的问题
  5. ElasticSearch插件demo
  6. 工作92:500错误
  7. 前端学习(2442):解决跨域问题
  8. 使用jquery打造一个动态的预览产品颜色效果
  9. 鸿蒙将至,安卓安否?
  10. UART协议概述与实现
  11. Linux命令解释之fdisk
  12. 《Flutter 从0到1构建大前端应用》读后感—第8章【持久化】
  13. 发明与实用新型专利了解
  14. 计算机考研408每日一题 day161
  15. 计算机中英文标点符号对照表,常用中文标点符号和键盘对照表.doc
  16. 域名证书是什么样子的_什么是网站域名证书
  17. uni-app实现文件管理器(Android)
  18. https证书存在错误该怎么解决
  19. 使markdown文档中的图片居中
  20. pandas 中.dropna()的用法

热门文章

  1. 数据可视化之农作物产量,主要农产品总产量是多少?
  2. matlab 黄金分析,matlab黄金分割法求解
  3. qlv文件怎么转成mp4格式?qlv转mp4格式步骤详解
  4. 1. C语言的第一个程序
  5. 一文搞懂supervisor进程管理
  6. word abbreviation
  7. 计算机配置64位几个字节,电脑装32位还是64位系统
  8. stm32 CAN通信 TJA1040
  9. vue3中的Suspense
  10. 华硕a53s拆机图解_华硕a53s配置 功能与外观描述【图解】