Flink内核原理与实现
上QQ阅读APP看书,第一时间看更新

第5章 类型与序列化

Flink内部自主进行内存管理,将数据以二进制结构保存在内存中,目前的实现中大量使用了堆外内存。如果让开发人员直接操作二进制结构,代码会变得复杂臃肿,所以大数据平台在设计API的时候,允许用户直接像编写普通Java应用程序一样使用其API开发Function,直接使用JDK提供的类型和自定义类型。

普通的Java对象类型与内部的二进制结构之间存在不一致,所以需要设计一套相互转换的机制,让Flink能够识别对象的类型,并且知道如何进行序列化/反序列化,Flink中的类型与序列化系统的目的就是解决此问题。

在Flink中有物理类型和逻辑类型两种类型系统,其中物理类型系统是面向开发者的,让普通开发者在开发Flink应用的时候就像编写普通的Java代码一样,逻辑类型系统是描述物理类型的类型系统,让Flink能够对物理类型进行序列化/反序列化,其作用如图5-1所示。

图5-1 逻辑类型/序列化的承上启下作用

Flink目前有两套逻辑类型系统:TypeInfomation类型系统和Flink SQL中的LogicalTypes类型系统。

TypeInformation类型系统是为DataStream/DataSet API设计的,用来描述对象的类型信息,在运行时根据TypeInfomation的类型描述来序列化对象。在1.9版本引入Blink Planner之前,Flink SQL依赖于TypeInfomation类型系统定义表的元信息(Schema)。在DataStream/DataSet API中,TypeInfomation类型系统没有问题,但是应用在Flink SQL时存在以下一些问题。

1)该类型系统与SQL的兼容性不好。

2)无法控制Decimal类型的精度。

3)无法区分char和varchar类型。

4)物理类型和逻辑类型紧耦合。

5)物理类型是类型描述,而不是类型的序列化/反序列化器。

所以Flink在1.9版本中为Flink SQL引入了新的LogicalTypes类型系统。使用DataType描述SQL的表、字段、函数参数等类型,DataType有两个职责:

1)声明逻辑类型LogicalType。

2)运行时逻辑转换类,允许为空。

在运行时将LogicalType转换为对应的TypeInfomation类型进行序列化。

下面将一一介绍DataStream的类型系统、SQL的类型系统、数据的序列化过程。