1. 環形緩沖區其實是一個字節數組,在MapTask.MapOutputBuffer中定義的。數組中存放著key、value的序列化數據和key、value的元數據信息
2. key/value的元數據存儲的格式是int類型,每個key/value對應一個元數據,元數據由4個int組成,第一個int存放value的起始位置,第二個存放key的起始位置,第三個存放partition,最后一個存放value的長度。
3. key/value序列化的數據和元數據在環形緩沖區中的存儲是由equator分隔的,key/value按照索引遞增的方向存儲,meta則按照索引遞減的方向存儲,將其數組抽象為一個環形結構之后,以equator為界,key/value順時針存儲,meta逆時針存儲。
4. 環形緩沖區:參考下圖
5. 我們可以將之抽象成環形狀態:如下圖
6. 當數據量達到閾值(數組的80%)開始進行溢寫,溢寫后,釋放空間,重置equator點。
重置時,如果已經存在數據(20%的空間會繼續寫進來數據),一般不會移動kv對,而是移動元數據。