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