Spark源码分析(4)

Spark 源码分析(4)

Posted by UNMOVE on April 18, 2018

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的长度作了限制。