Flink学习笔记--数据类型和专属序列化框架

1. 已有序列化框架

1.1 序列化和反序列化的定义

  • 序列化

就是讲数据结构、或者对象转换成一个二进制串的过程,在java里面则可理解成一个byte数组

  • 反序列化

与序列化恰恰相反,就是讲二进制串再转换成数据结构或者对象的过程。

1.2 常见的序列化框架

目前java生态游许多序列化框架,例如 java serialization, kryo, apache avro等。

但是flink确没有使用这些已有的序列化框架,而是自己定制了序列化框架。

接下来首先了解一下flink中的数据类型。

 

2. Flink中的数据类型

2.1 数据类型和与其对应的TypeInformation

 

Flink学习笔记--数据类型和专属序列化框架

flink中的这么写数据类型,在flink中是如何表述的呢,答案是在Flink中用TypeInformation做为类型描述符来表示每一种要表示的数据类型。例如对于Basic类型,则会用BasicTypeInfor来表示,例如Integer则用IntegerInfo来表示。

如下图对应上图中的每一个类型,都会有一个对应的TypeInfo

Flink学习笔记--数据类型和专属序列化框架

 

即在Flink中每一个具体类型,都对应了一个具体的TypeInformation实现类。

2.2 序列化器

在Flink序列化过程中,进行序列化操作必须要有序列化器()。序列化器从何而来??上文我们提到了,在flink中每个数据类型都对应了一个TypeInformation的具体实现,每一个TypeInformation都会为对应的具体数据类型提供一个专属的序列化器。通过具体的TypeInformation提供的createSerialize()方法即可得到序列化操作反序列化操作对象的TypeSerializer。如下图所示,

Flink学习笔记--数据类型和专属序列化框架

每个具体的TypeInformation都对应了一个类型序列化器。

这里注意最后一个GenericTypeInfo是用的KryoSerializer序列化器。

2.3 MemorySegment

如下图所示,一个Tuple3为例,概述了一个Tuple3对象序列化的过程,MemorySegment代表Flink中最小的内存分配单元,相当于java中的byte数组,会将对象序列化到预分配的内存块中。

memorySegment代表1个固定长度的内存,默认是32kb。

Flink学习笔记--数据类型和专属序列化框架

3. Flink序列化常见的场景说明

主要有4中场景

  • 注册子类型
  • 注册自定义序列化
  • 添加类型提示
  • 手动创建一个TypeInformation

4. Flink通信层的序列化

如果Flink的Task之间需要跨网络传输数据记录,就需要上游的Task把数据序列化之后写入NetworkBufferPool下游的Task从NetworkBufferPool读取数据,并进行反序列化操作,再进行后续的逻辑处理。

为了将事件记录写入Buffer,flink提供了:

记录序列化器RecordSerializer

记录反序列化器RecordDeserializer

以及事件序列化器EventSerializer。

 

 

5. 参考链接

https://cloud.tencent.com/developer/news/454819