Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle

Spark Tungsten揭秘 Day2

Tungsten-sort Based Shuffle

今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle。数组

首先解释下概念,Tungsten-sort是对普通sort的一种优化,排序的不是内容自己,而是内容序列化后字节数组的指针(元数据),把数据的排序转变为了指针数组的排序,实现了直接对序列化后的二进制数据进行排序。因为直接基于二进制数据进行操做,因此在这里面没有序列化和反序列化的过程。内存的消耗大大下降,相应的,会极大的减小的gc的开销。数据结构

Page的管理

要作到这种,jvm的内存管理结构没法完成,因此提出了Page的概念。jvm

Page是由block组成的,咱们先看一下Block的结构,能够看到,除了记录page编号外,Block内部组成是MemoryLocation。
Snip20160803_7大数据

在MemoryLocation中,重要的就是记录了对象及初始位置的定位offset。实际运行能够onheap或者offheap(用NIO或者Tachyon管理)。优化

Snip20160803_6

在shuffle角度,都是统一在SortShuffleManager中进行构造。能够看到,在以下位置构造了UnsafeShuffleWriter,但没有UnsafeShuffleReader,从Tungsten角度讲,reader使用的是HashShuffleReader。
Snip20160803_10spa

从注释中,能够看到数据一旦进来,就使用shuffle write进行序列化,在序列化的二进制基础上进行排序,这样就能够减小内存的GC。这种优化须要咱们的序列化器能够在不反序列化的状况下从新排序。
Snip20160803_12指针

数据写入

让咱们进入UnsafeShuffleWriter对象

会经过MyByteArrayOutputStream直接对内存操做
Snip20160803_13排序

在write方法中,会循环记录,写入Sorter。
Snip20160803_14ip

Snip20160803_15

其中,serBuffle默认大小是1M,并且已是序列化以后的数据了。
Snip20160803_24

在插入前,首先会分配内存,以后会根据每条数据,采用游标的方式进行遍历,并计算找到recordAddress,完成插入操做。
Snip20160803_18

在内存分配时,会有两种分配方式UNSAFE和HEAP,内部各有一套本身的内存评估机制
Snip20160803_20
Snip20160803_21

此外,recordAddress是有一套本身的编解码方式。
Snip20160803_17

最终在插入时,仅仅是存放了一个RecordPointer,也就是数据指针。
Snip20160803_26

小结

在具体插入操做的时候,以Page为核心单位,从Page角度讲,插入记录的时候,自己也有location和大小,须要找到page中指针的位置。在整个内存中有多个Page,每一个Page有限定的大小,满了以后会分配下一个Page。从jvm角度讲,最底层的数据结构是字节数组,因此outputStream和序列化都是对字节数组来操做的。进行shuffle操做的时候,实际是对指针进行操做,这是没有序列化和反序列化的关键。数据量也少,因此内存使用率低,大大减小了GC。

最后,说明下,即便配置了Tungsten shuffle,在一些状况也会自动变成sort-based shuffle,从数据结构角度讲,限制蛮多,记录不能太大,单条记录不能超过128M,shuffle的时候中间过程不能产生太多的小文件,不能超过160W,aggregation或者输出后须要排序的操做也不能够。

欲知后事如何,且听下回分解!

DT大数据天天晚上20:00YY频道现场授课频道68917580

相关文章
相关标签/搜索