1. 程式人生 > >Map/Reduce的記憶體使用設定

Map/Reduce的記憶體使用設定

一、背景

今天採用10臺異構的機器做測試,對500G的資料進行運算分析,業務比較簡單,叢集機器的結構如下:

A:雙核CPU×1、500G硬碟×1,記憶體2G×1(Slaver),5臺

B:四核CPU×2、500G硬碟×2,記憶體4G×2(Slaver),4臺

C:四核CPU×2、500G硬碟×2,記憶體4G×8(Master),1臺

軟體採用Hadoop 0.20.2,Linux作業系統。

二、過程

1、製造了500G的資料存放到叢集中。

2、修改配置,主要是併發的Map和Reduce數量。修改如下圖:

QQ截圖未命名

3、修改mapred-site.xml配置檔案中的mapred.child.java.opts引數為-Xmx2046m

4、啟動Job,半路出現了Cannot allocate memory錯誤,明顯是記憶體分配不夠。細看報錯的機器,是A類機器報此錯誤。

5、修改A類機器的mapred-site.xml配置檔案,將mapred.child.java.opts修改為-Xmx1024m,執行Job,錯誤消失。

三、分析總結

1、第一次採用這麼少的機器處理500G的資料,確實在配置優化上需要做對應的調整。

2、Map的數量和CPU的核數也有直接關係。一般來說最好不要高於CPU的核數。(CPU是4核,併發數最好設定為4).

3、通過調整得出一個簡單的公式:Map的併發數量(需要不大於CPU核數)×mapred.child.java.opts < 該節點機器的總記憶體。

4、當然併發數大於記憶體或CPU核數也可以,但是有些風險,Task執行錯誤的風險。

5、計算的能力還是和硬體效能有關係,硬體越好,計算的效率還是很高的。當然差的機器也能使用,添磚加瓦一起幹總是好的。

6、如果叢集是異構的機器,那麼還是建議每臺機器做不同的配置引數。統一化的配置還是比較適合同構叢集。

7、一些統一的引數也可以通過MR的程式碼用conf.set(key,value);的方式來設定。

8、有些時候沒寫東西了,最近事情比較多。如果有疑問還是很歡迎大家發郵件討論:[email protected]