Flink中的 BinaryRowData 以及大小端
背景
本文基于 Flink 1.17.0
写此文章的目的是为了说明 Flink 堆内和堆外内存以及 内部 BinaryRowData
行处理的优化。
分析
堆内和堆外内存
跟Spark的内存管理不一样,Flink 中的堆内和堆外一直都是存在的。
堆内内存(JVM Heap)存储用户对象和Flink 框架的运行时数据,而堆外内存(Off-heap Memory)包括用于网络通信的直接内存(Direct Memory)和用于第三方库(如RocksDB)的堆外内存(offheap Memory)。
分别可以通过 MemorySegmentFactory 的 wrap allocateUnpooledOffHeapMemory allocateOffHeapUnsafeMemory
方法来进行分配对应的堆内,直接内存以及堆外内存。无论是堆内还是堆外内存都是用 MemorySegment
来承载的。
BinaryRowData
关于该BinaryRowData的作用和Spark中一样
- 减少GC压力
- 不影响正常的数据操作,减少了数据存储内存,精确计算内存的使用情况
- 减少了序列化和反序列化的的消耗
Byte大小端
在 MemorySegment
类中,也存在中大小端的判断:
private static final boolean LITTLE_ENDIAN =(ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN);
在Flink 中,数据需要经过序列化和反序列化才能在网络中传输或持久化存储。如果数据源的字节序与Flink 运行的机器的字节序不一致,就可能出现解析错误。通过区分大端和小端,Flink 能够正确地进行转换,确保数据的一致性。