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