概述

Flink数据序列化操作

  • MemorySegment 是Flink的最小内存分配单元
  • 默认 32KB
  • 先放到内存中,也可以序列化,借助KryoSerializer等
  • 内存不够序列化到 磁盘 flink_4/4.jpg

Flink内存模型

  • 托管内存是由Flink负责分配和管理的本地(堆外)内存
  • 在流处理作业中用于RocksDBStateBackend状态存储后端
  • 在批处理作业中用于排序、哈希表及缓存中间结果
    flink_4/5.jpg

MemorySegment

MemorySegment 相关类图

  • HeapMemorySegment 提供了操作堆内存的方法
  • HybridMemorySegment 中提供了创建和操作堆内存和堆外内存的方法 flink_4/6.jpg

分析

  • DataOutputView 扩展了 java.io.DataOuput,提供多个写入视图
  • DataInputView 接口扩展了 java.io.DataInput,提供多个读取视图
  • MemoryManager主要用于管理排序、哈希和缓存等操作对应的内存空间,且这些操作主要集中在离线计算场景中
  • NetworkBufferPool通过MemorySegmentFactory申请用于存储NetworkBuffer的MemorySegment内存空间

MemorySegment

  • 提供了 copy,get,put 的函数
  • 将 byte[] 读取返回 java.io.DataInput
  • 将 DataOutput 写入到 byte[]
  • 各种 long,double,int 写入到 byte[]
  • 还有 比较,offst 复制等等

管理和调用过程

1
2
TaskManager --> TaskSlot  --> MemorySegment --> MemorySegment
  

DataInputView 和 DataOutputView

DataInputView 与 DataOutputView 相关类图 flink_4/7.jpg

Input 相关主要实现有三种

  • DataInputDeserializer,实现了简单且高效的反序列化器
  • DataInputViewStreamWrapper,对DataInputStream接口进行拓展,直接将InputStream数据转换为DataInputView输入数据
  • AbstractPagedInputView,实现了基于多个内存页的数据输入,且具有不同的实现类

Output 相关主要实现类有三个

  • DataOutputSerializer,基于 DataOutput接口实现了简单且高效的序列化器
  • DataOutputViewStreamWrapper,主要将内存中的二进制数据直接转换为DataOutputStream
  • AbstractPagedOutputView,基于多个内存页的输出视图

序列化

  • DataInputDeserializer
  • DataOutputSerializer

包装类

  • DataInputViewStreamWrapper
  • DataOutputViewStreamWrapper

多个 MemorySegment 内存块的操作

  • AbstractPagedInputView
  • AbstractPagedOutputView

AbstractPagedInputView 相关类图
flink_4/8.jpg

出入 实现类介绍

  • AbstractChannelReaderInputView:底层基于FileIOChannel实现
  • ChannelReaderInputView:底层通过BlockChannelReader实现从FileIOChannel中读取数据
  • HeaderlessChannelReaderInputView:功能和ChannelReaderInputView基本一致
  • CompressedHeaderlessChannelReaderInputView:底层基于BufferFileReader实现从文件中读取数据
  • RandomAccessInputView:实现了SeekableDataInputView接口,提供了随机访问内存的输入视图
  • SeekableFileChannelInputView:底层由BlockChannelReader支持的DataInputView实现
  • FileChannelInputView:和SeekableFileChannelInputView相比,不具备检索功能,即必须连续读取数据
  • LongHashPaLongHashPartition和BinaryHashPartition则用于Flink SQL模块

AbstractPagedOutputView 相关类图 flink_4/9.jpg

输出 实现类介绍

  • ChannelWriterOutputView:AbstractChannelWriterOutputView的实现类
  • AbstractChannelWriterOutputView:基于FileIOChannel的抽象实现
  • HeaderlessChannelWriterOutputView:内部FileIOChannel的实现类为BlockChannelWriter
  • CompressedHeaderlessChannelWriterOutputView:底层FileIOChannel实现为BufferFileWriter
  • FileChannelOutputView:底层基于BlockChannelWriter将MemorySegment中的数据输出到磁盘
  • RandomAccessOutputView:通过SeekableDataOutputView.setWritePosition()方法实现数据的随机写入
  • SpllingBuffer:主要实现内存数据的溢写操作
  • SimpleCollectingOutputView:该视图具有完整的MemorySegment列表

序列化和反序列化

TypeInformation

  • 用来定义和管理数据类型
  • 用户自定义函数输入或返回值的类型信息都是通过TypeInformation实现的
  • 充当了生成序列化器、比较器以及执行语义检查(例如是否存在用作Join/grouping主键字段)的工具

TypeInformation 相关类图
flink_4/10.jpg

TypeInformation根据数据类型不同主要分为以下几种实现类型

  • BasicTypeInfo:用于所有Java基础类型以及String、Date、Void、BigInteger、BigDecimal等类型
  • BasicArrayTypeInfo:用于由Java基础类型及String构成的数组类型
  • CompositeType:复合类型数据
  • WritableTypeInfo:用于支持扩展Hadoop Writable接口的数据类型
  • GenericTypeInfo:用于泛型类型数据

TypeSerializer数据序列化
flink_4/11.jpg

对StreamRecord 的序列化和反序列化操作

  • RecordSerializer
  • Recorddeserializer

StreamTaskNetworkInput 整体设计图

  • ​data ingestion from the network into a Flink task (e.g., StreamTask)
  • It manages deserialization, buffering, and spilling to disk when data exceeds memory limits flink_4/12.jpg

参考