Tungsten的内存管理机制
与Sort shuffle相比,Tungsten采用独特的内存模型来存储数据,而Sort shuffle采用Java的数据结构AppendOnlyMap来存储数据,并且存储的数据是序列化的。这种独特的内存模型叫做page。序列化后的数据放在page中,当page满后,spill到磁盘文件,然后从新allocate一个新的page(如果spark.unsafe.offHeap=true,会从off-heap分配内存,否则,从in-heap分配内存)。最后将page里数据和spilled磁盘文件merge到一个文件里。注意merge的时候不需要反序列化(sort shuffle需要)。
为了数据record在page中寻址,定义了PackedRecordPointer对象用一个64bit的long型变量来记录如下信息:
[24 bit partition number][13 bit memory page number][27 bit offset in page]。
注意这些信息是用来将数据按照partition进行排序。从这些信息中,我们得到如下的约束。
1. 一个是partition 的数量(Reducer的数目)最多为2^24=16777216。
2. 单条记录不能大于 2^27=128 MB,加上page数目限制,一个task 能管理到的内存最多是 2^13 * 128M 也就是1TB左右。