MapReduce 如何解決負載均衡和數據傾斜:
階段主要出在Map作業結束後,shuffer(洗牌)過程中,如何將map處理後的結果分成多少份,交由Reduce作業,使得每部分reduce作業儘可能均衡處理數據計算。
系統默認將partitions 按照Hash模運算分割(存儲對象的hash值與reduce的個數取模),這樣很容易出現數據傾斜,導致其中一個reduce作業分得大量數據計算,另一個ruduce作業基本上沒有任何數據處理。如何,解決的這種事情,就需要靠程序控制partitions的值
Sort:默認排序是按照字典排序的(按ASCII)
Shuffer階段比較的操作要執行兩次,一次是map task之後的sort另一次是在從本次磁盤將partition數據拷貝到指定reduce 之前的合併,將符合統一範圍的key的數據歸併
面試:
1.partition:將map輸出的數據,按照某種規則將數據劃分,分給哪一個reduce,默認使用hash模運算執行
2.spill:
過程:map的內存緩存區數據填滿時,啓動一個單獨的線程,將數據按照一定比例寫入本地磁盤。
Sort:將數據按照大小排序(可自定義)默認字典排序
Combiner:(可有可無)將相同的K_V中的value加起來,減少溢寫磁盤的數據
Shuffer的後半過程:
將map處理後放入map節點的本地磁盤的數據拷貝到rudece節點的內存中 去,數據量少的話,直接交由reduce處理。數據量大的時候,同樣需要溢寫到磁盤中,按照K值相同的方法進行merge,然後在交由指定的reduce執行
修改默認hdfs的block大小:
這個需要修改hdfs-site.conf配置文件,增加全局參數dfs.block.size。
如下:
修改後參數,
把配置同步到其它節點,並重啓hdfs。