Flink学习笔记--数据类型和专属序列化框架
1. 已有序列化框架
1.1 序列化和反序列化的定义
- 序列化
就是讲数据结构、或者对象转换成一个二进制串的过程,在java里面则可理解成一个byte数组
- 反序列化
与序列化恰恰相反,就是讲二进制串再转换成数据结构或者对象的过程。
1.2 常见的序列化框架
目前java生态游许多序列化框架,例如 java serialization, kryo, apache avro等。
但是flink确没有使用这些已有的序列化框架,而是自己定制了序列化框架。
接下来首先了解一下flink中的数据类型。
2. Flink中的数据类型
2.1 数据类型和与其对应的TypeInformation
flink中的这么写数据类型,在flink中是如何表述的呢,答案是在Flink中用TypeInformation做为类型描述符来表示每一种要表示的数据类型。例如对于Basic类型,则会用BasicTypeInfor来表示,例如Integer则用IntegerInfo来表示。
如下图对应上图中的每一个类型,都会有一个对应的TypeInfo
即在Flink中每一个具体类型,都对应了一个具体的TypeInformation实现类。
2.2 序列化器
在Flink序列化过程中,进行序列化操作必须要有序列化器()。序列化器从何而来??上文我们提到了,在flink中每个数据类型都对应了一个TypeInformation的具体实现,每一个TypeInformation都会为对应的具体数据类型提供一个专属的序列化器。通过具体的TypeInformation提供的createSerialize()方法即可得到序列化操作与反序列化操作对象的TypeSerializer。如下图所示,
每个具体的TypeInformation都对应了一个类型序列化器。
这里注意最后一个GenericTypeInfo是用的KryoSerializer序列化器。
2.3 MemorySegment
如下图所示,一个Tuple3为例,概述了一个Tuple3对象序列化的过程,MemorySegment代表Flink中最小的内存分配单元,相当于java中的byte数组,会将对象序列化到预分配的内存块中。
memorySegment代表1个固定长度的内存,默认是32kb。
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