BytesToBytesMap分析
查看了spark 2.2版本的BytesToBytesMap的相关函数,细致了解spark 2.2版本的BytesToBytesMap如何工作。
spark 2.2版本BytesToBytesMap变量详解
-
logger:用于程序运行时输出日志信息。
-
growthStrategy:控制在该hash map被占满之后,如何增长其大小。
-
taskMemoryManager:
-
dataPages:指针列表。每个元素为一个指向page的指针。
-
currentPage:当前页面指针。指向当前正在处理的页面,当该页面满之后,一个新的页面会被申请,同时该指针会指向新的页面。
-
pageCursor:currentPage中的偏移量,标志新记录被添加时的起始位置。
-
MAC_CAPACITY:BytesToBytesMap所支持的最大key的个数。hash map大小必须是2的幂次方,并且longArray最多存放2^30个元素(小于Integer.MaxValue的最大的2的幂次方),而longArray中两个元素才能存储一个完整的key,所以该值为2^29。
-
longArray:存放简要的记录信息,key的address和hashcode。该数组中每个信息占长为8字节,而实际上address仅需37字节,hashcode仅需27字节。
-
canGrowArray:longArray是否能增长,为false时将不再添加任何元素。
-
pageSizeBytes:标志page的大小。不允许一条record跨度多个page,该变量会作为记录大小限制。
-
numKeys:该map中已定义的key的个数。
-
numValues:该map中定义的value的个数,每个key可对应多个value。
-
growthThreshold:当map中key的数量超过该阈值时,map将会扩展。
-
mask:用于截断hashcode的掩码,保证它们不会超过longArray的大小。
-
loc:lookup函数的返回值封装,其中包括了key是否已定义,key的位置和它的hashcode。
-
enablePerfMetrics:
-
numProbes:
-
numKeyLookups:
-
peakMemoryUsedBytes:
-
initialCapacity:
-
blockManager:
-
serializerManager:
-
destructiveIterator:
-
spillWriters:
Spark 2.2版本BytesToBytesMap方法详解
-
iterator:返回一个MapIterator用于访问map中的所有记录。
-
destructiveIterator:返回一个MapIterator用于访问map中的所有记录,在某个page被访问结束后,会直接释放该page。
-
lookup & safeLookup:查找某个key是否已被定义。
-
内部类:MapIterator
该map的迭代器,重写了迭代器的相关函数以适用于BytesToBytesMap。
- advanceToNextPage:切换到下一个page,若destructive为true,则释放当前page。切换之后会设置相应变量的值,currentPage被设置为当前page,recordsInPage设置为当前page的records个数,offsetInPage设置为page当前偏移(4或8)。
-
内部类:Location
-
updateAddressAndSizes:更新key和value的位置和大小。具体包括baseObject、keyLength、keyOffset、valueLength和valueOffset。
-
with(3个参数):设置lookup函数返回时的相关信息。pos为key在longArray中的位置,isDefined为该key是否被定义以及key的hashcode。若key被定义则调用updateAddressAndSizes更新loc中record的相关信息。
-
with(2个参数):用于迭代器MapIterator的next方法中,设置相关变量用于record的读取。
- nextValue:查找下一个拥有同样key的record。
- getMemoryPage:返回该条record存放的page。
- isDefined:返回isDefined的值,表示该key在是否在当前position被定义。
- append:该函数用于向map中添加record,为了兼容某些不支持字节不对齐访问的处理器,此处对key和value的长度作了限制。
-