2017-03-09 64 views
2

在Hadoop Yarn中,下面是觀察值:爲什麼MapReduce映射內存大於簇上的塊大小?

a)對於每個InputSplit或塊,將會觸發一個新的地圖。

b)羣集的典型塊大小爲128 MB。

c)在大多數羣集中,MapReduce.map.memory.mb的配置大於1 GB。

其實對於Cloudera的塊大小的建議是128 MB和MapReduce.map.memory.mb爲1 GB

當塊大小隻有128 MB,爲什麼我們需要1 GB分配給映射存儲器(MapReduce.map.memory.mb)?理想情況下,128 MB應該最多可以滿足需要。爲什麼我們甚至給予地圖內存塊大小?

回答

0

每個容器(映射程序正在運行的地方)都運行在單獨的JVM上。 mapreduce.map.memory.mb反映了容器所需的全部空間:堆,堆棧等。因此,除了加載這些128MB的塊大小以進行處理外,還必須管理其他與JVM相關的進程,因此它需要更多的內存。

1

MapReduce根本不會將完整的128 MB輸入塊加載到內存中,因爲它應該通過地圖功能對數據進行流式傳輸。

但是它有一些輸出和溢出緩衝區和排序緩衝區需要維護,它們非常大(高達64MB,mapreduce.task.io.sort.mb的默認值爲100MB)。

此外,您自己的地圖處理邏輯可能需要關聯內存,例如從其他地方加載的其他資源。畢竟,1gb是一個安全的默認值,它不一定與輸入塊大小相關聯。

框架開銷,折扣分配的溢出緩衝區是超小的(< 50mb)。

+0

感謝@Thomas的解釋。輸出,溢出緩衝區和排序緩衝區需要內存是有意義的。作爲輸出,溢出緩衝區和排序緩衝區來自映射函數的數據,該數據以128 MB的塊運行,如果我的塊大小爲256 MB,我希望有更多的內存分配給MapReduce.map.memory.mb? – Premchand

+0

@Premchand我不希望根據輸入塊大小更改映射器的堆內存。 –

相關問題