UnsafeRow编码优化
介绍
Spark UnsafeRow是Catalyst和Tungsten模块引入的内存优化方案,基于JVM提供的Unsafe接口实现,可以减少JVM对象并降低GC带来的性能影响。
UnsafeRow内存格式
Spark UnsafeRow定义了单行的数据内存分布格式,整行的数据都在一段连续内存中,具体的格式如下。
64bit(8byte)对齐,内存空间不紧凑但有利于提高访存性能
小端存储,这样低位类型存到高位内存(如存int到64位)不需要额外编码
所有列不管什么类型都按64bit存储,变长内容顺延存储

SparkFE编码兼容
Spark内部所有行数据存储默认都使用UnsafeRow格式,SparkFE提供了以下两种方式支持Spark都行编码。
编解码模式,对行的每一列进行重新的编解码,总内存占用更小,但存在编解码开销。
UnsafeRow兼容模式,内部行格式兼容UnsafeRow内存布局,没有编解码开销。
参考SparkFE配置文档,可以通过以下配置来开启UnsafeRow优化。
配置项
说明
默认值
备注
sparkfe.enable.unsaferow.optimization
是否开启UnsafeRow内存优化
false
开启后降低编解码开销,目前部分复杂类型不支持
Last updated