Flink 内存管理
概述
Flink数据序列化操作
Flink内存模型
MemorySegment
MemorySegment 相关类图
分析
- 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 复制等等
管理和调用过程
|
|
DataInputView 和 DataOutputView
DataInputView 与 DataOutputView 相关类图
Input 相关主要实现有三种
- DataInputDeserializer,实现了简单且高效的反序列化器
- DataInputViewStreamWrapper,对DataInputStream接口进行拓展,直接将InputStream数据转换为DataInputView输入数据
- AbstractPagedInputView,实现了基于多个内存页的数据输入,且具有不同的实现类
Output 相关主要实现类有三个
- DataOutputSerializer,基于 DataOutput接口实现了简单且高效的序列化器
- DataOutputViewStreamWrapper,主要将内存中的二进制数据直接转换为DataOutputStream
- AbstractPagedOutputView,基于多个内存页的输出视图
序列化
- DataInputDeserializer
- DataOutputSerializer
包装类
- DataInputViewStreamWrapper
- DataOutputViewStreamWrapper
多个 MemorySegment 内存块的操作
- AbstractPagedInputView
- AbstractPagedOutputView
出入 实现类介绍
- AbstractChannelReaderInputView:底层基于FileIOChannel实现
- ChannelReaderInputView:底层通过BlockChannelReader实现从FileIOChannel中读取数据
- HeaderlessChannelReaderInputView:功能和ChannelReaderInputView基本一致
- CompressedHeaderlessChannelReaderInputView:底层基于BufferFileReader实现从文件中读取数据
- RandomAccessInputView:实现了SeekableDataInputView接口,提供了随机访问内存的输入视图
- SeekableFileChannelInputView:底层由BlockChannelReader支持的DataInputView实现
- FileChannelInputView:和SeekableFileChannelInputView相比,不具备检索功能,即必须连续读取数据
- LongHashPaLongHashPartition和BinaryHashPartition则用于Flink SQL模块
输出 实现类介绍
- ChannelWriterOutputView:AbstractChannelWriterOutputView的实现类
- AbstractChannelWriterOutputView:基于FileIOChannel的抽象实现
- HeaderlessChannelWriterOutputView:内部FileIOChannel的实现类为BlockChannelWriter
- CompressedHeaderlessChannelWriterOutputView:底层FileIOChannel实现为BufferFileWriter
- FileChannelOutputView:底层基于BlockChannelWriter将MemorySegment中的数据输出到磁盘
- RandomAccessOutputView:通过SeekableDataOutputView.setWritePosition()方法实现数据的随机写入
- SpllingBuffer:主要实现内存数据的溢写操作
- SimpleCollectingOutputView:该视图具有完整的MemorySegment列表
序列化和反序列化
TypeInformation
- 用来定义和管理数据类型
- 用户自定义函数输入或返回值的类型信息都是通过TypeInformation实现的
- 充当了生成序列化器、比较器以及执行语义检查(例如是否存在用作Join/grouping主键字段)的工具
TypeInformation根据数据类型不同主要分为以下几种实现类型
- BasicTypeInfo:用于所有Java基础类型以及String、Date、Void、BigInteger、BigDecimal等类型
- BasicArrayTypeInfo:用于由Java基础类型及String构成的数组类型
- CompositeType:复合类型数据
- WritableTypeInfo:用于支持扩展Hadoop Writable接口的数据类型
- GenericTypeInfo:用于泛型类型数据
对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
参考
- 1.20 官方文档
- Lansonli技术博客
- 深入浅出理解Flink运行时架构
- Flink Execution Graph
- Flink实战(11)-Exactly-Once语义之两阶段提交
- Flink on k8s 讲解与实战操作
- Flink Checkpoint 原理流程以及常见失败原因分析
- Stateful Stream Processing
- A Deep-Dive into Flink’s Network Stack
- Analysis of Network Flow Control and Back Pressure: Flink Advanced Tutorials
- 批流统一计算引擎的动力源泉—Flink Shuffle机制的重构与优化
- 业界RemoteShuffleService实现汇总
- Flink Pluggable ShuffleService源码阅读
- Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
- 详细图解 Netty Reactor 启动全流程 | 万字长文 | 多图预警
- Netty Reactor 工作架构图
- Flink架构,源码及debug
- 白话 FLIP
- 白话Apache Flink FLIP-18: 让排序飞起来:代码生成让性能提升一大截