MapReduce的原始碼分析中map端輸出的原始碼分析
阿新 • • 發佈:2018-12-11
分割槽:
只有一個reduce的情況下,partition號為0
分割槽大有1的情況下,採用hash的方法:
在輸入階段最核心的類是linerecorderReader()
在輸出階段最核心的類是mapoutputbuffer()
達到80%的時候會溢寫磁碟。
mapoutputkey做了三件事:
①:設定緩衝區溢寫磁碟的大小
②:準備了一個快排比較器,比較器底層看使用者定義的,如果使用者沒有定義,那麼就用系統預設的排序演算法
③:排序:
④:combiner:就是一個微縮版的reduce的實現
combiner可以設定,必須繼承reduce方法
預設情況下,溢寫磁碟三次就會觸發一次combiner 去執行,其實在溢寫磁碟之前的sort階段,也有一個比較小的combiner
溢寫執行緒:
在這裡有一個write方法,預設是(k,v)和p的形式。
在map端的write最終會以序列化的形式溢寫在記憶體緩衝區中。
環形緩衝區:從零的位置開始放key和value,從另一個方向開始放索引,在剩下的部分:
按照赤道分開,繼續存放key,value和索引
最終完成首位相接。
交換key,value的位置的時候,可以考慮交換索引的位置。
當達到80%的時候會溢寫磁碟,在溢寫磁碟之前會又一次sort排序
new map
輸出會有一個重新整理
shuffle有一個sortandsplit
這才出發combiner