首页 理论教育 解决spill时处理二进制数据的问题

解决spill时处理二进制数据的问题

时间:2023-06-29 理论教育 版权反馈
【摘要】:也就是图8-9中的第3步和第7步spill。在spill时就会调用writeSortedFile方法,之后便释放占用的全部内存。对应writeSortedFile方法的解析,在理解了记录在内存页中存储的组织形式之后,相对比较好理解,因此这里仅给出该方法的注释信息,具体代码如下。至此,基本上解析了基于Project Tungsten内存模型的整个Shuffle数据处理过程,作为扩展,下面简单描述一下内存中的排序,排序时主要使用了TimSort排序算法,所采用的比较器为SortComparator,对应的定义如下。

解决spill时处理二进制数据的问题

可以将继承MemoryConsumer类的子类作为二进制解析数据的关键入口点,从前面对TaskMemoryManager类的解析源代码中已经知道,当内存不足时,会采用某种策略调用Mem-oryConsumer的spill方法(对应策略比较简单,可以直接参考源代码),因此,spill方法也是理解ShuffleExternalSorter类内部处理过程的一个关键入口点。也就是图8-9中的第3步和第7步spill。

下面是spill的关键代码及其解析。

978-7-111-55442-4-Chapter08-48.jpg

在spill时就会调用writeSortedFile方法(记录集处理完成后也会调用,只是参数不同),之后便释放占用的全部内存。对应writeSortedFile方法的解析,在理解了记录在内存页中存储的组织形式之后,相对比较好理解,因此这里仅给出该方法的注释信息,具体代码如下。

978-7-111-55442-4-Chapter08-49.jpg(www.xing528.com)

至此,基本上解析了基于Project Tungsten内存模型的整个Shuffle数据处理过程,作为扩展,下面简单描述一下内存中的排序(对应ShuffleInMemorySorter类),排序时主要使用了TimSort排序算法(封装Java上的实现),所采用的比较器为SortComparator,对应的定义如下。

978-7-111-55442-4-Chapter08-50.jpg

从源代码中可以看到,比较时,使用的是PackedRecordPointer对象中的分区ID,所以在基于Tungsten的Shuffle机制中,记录是按分区ID进行排序,并没有对分区内部的记录进行排序。

基于Project Tungsten内存模型的数据处理,从MemoryConsumer角度出发(包含那些内部使用了MemoryConsumer的类,如UnsafeExternalSorter),逐个去理解内部的数据结构组织与二进制数据处理等方式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈