假設(shè)mapred.job.shuffle.input.buffer.percent為0.7,reduce task的max heapsize為1G,那么用來做下載數(shù)據(jù)緩存的內(nèi)存就為大概700MB左右,這700M的內(nèi)存,跟map端一樣,也不是要等到全部寫滿才會往磁盤刷的,而是當這700M中被使用到了一定的限度(通常是一個百分比),就會開始往磁盤刷。這個限度閾值也是可以通過job參數(shù)來設(shè)定的,設(shè)定參數(shù)為:mapred.job.shuffle.merge.percent(default 0.66)。如果下載速度很快,很容易就把內(nèi)存緩存撐大,那么調(diào)整一下這個參數(shù)有可能會對reduce的性能有所幫助。
當reduce將所有的map上對應(yīng)自己partition的數(shù)據(jù)下載完成后,就會開始真正的reduce計算階段(中間有個sort階段通常時間非常短,幾秒鐘就完成了,因為整個下載階段就已經(jīng)是邊下載邊sort,然后邊merge的)。當reduce task真正進入reduce函數(shù)的計算階段的時候,有一個參數(shù)也是可以調(diào)整reduce的計算行為。也就是:mapred.job.reduce.input.buffer.percent(default 0.0)。由于reduce計算時肯定也是需要消耗內(nèi)存的,而在讀取reduce需要的數(shù)據(jù)時,同樣是需要內(nèi)存作為buffer,這個參數(shù)是控制,需要多少的內(nèi)存百分比來作為reduce讀已經(jīng)sort好的數(shù)據(jù)的buffer百分比。默認情況下為0,也就是說,默認情況下,reduce是全部從磁盤開始讀處理數(shù)據(jù)。如果這個參數(shù)大于0,那么就會有一定量的數(shù)據(jù)被緩存在內(nèi)存并輸送給reduce,當reduce計算邏輯消耗內(nèi)存很小時,可以分一部分內(nèi)存用來緩存數(shù)據(jù),反正reduce的內(nèi)存閑著也是閑著。

VIA:阿里集團數(shù)據(jù)平臺
更多詳細信息,請您微信關(guān)注“計算網(wǎng)”公眾號: