mapred-site.xml
mapreduce.map.memory.mb 1536 每個Map Container的大小
mapreduce.reduce.memory.mb 2560 每個Reduce Container的大小
mapreduce.map.java.opts -Xmx1024 Map任務的jvm-Xmx堆大小。
//實際Map函數占用的jvm堆大小
mapreduce.reduce.java.opts -Xmx2048 Reduce任務的jvm-Xmx堆大小。
//實際Reduce函數占用的jvm堆大小
- 每個container是動態分配的
mapreduce.map.memory.mb和mapreduce.map.java.opts之間有512MB的差值,這是container留的內存余地,可以用來運行JVM Perm Gen、Native Lib。
所以mapreduce.map.java.opts的值一定要小於mapreduce.map.memory.mb的值。
理解mapreduce.map.java.opts、mapreduce.reduce.java.opts 以map任務為例,Container其實就是在執行一個腳本文件,而腳本文件中,會執行一個 Java 的子進程,這個子進程就是真正的 Map Task,mapreduce.map.java.opts 其實就是啟動 JVM 虛擬機時,傳遞給虛擬機的啟動參數,而默認值 -Xmx200m 表示這個 Java 程序可以使用的最大堆內存數,一旦超過這個大小,JVM 就會拋出 Out of Memory 異常,並終止進程。而 mapreduce.map.memory.mb 設置的是 Container 的內存上限,這個參數由 NodeManager 讀取並進行控制,當 Container 的內存大小超過了這個參數值,NodeManager 會負責 kill 掉 Container。在后面分析 yarn.nodemanager.vmem-pmem-ratio 這個參數的時候,會講解 NodeManager 監控 Container 內存(包括虛擬內存和物理內存)及 kill 掉 Container 的過程。 也就是說,mapreduce.map.java.opts一定要小於mapreduce.map.memory.mb
mapreduce.reduce.java.opts同mapreduce.map.java.opts一樣的道理。
這兩個參數,差值太大太小都可能回有問題:
mapreduce.{map,reduce}.memory.mb和 mapreduce.{map,reduce}.java.opts,一旦設置不合理,則會使得內存資源浪費嚴重,比如將前者設置為4096MB,但后者卻是“-Xmx2g”,則剩余2g實際上無法讓java heap使用到。參見
https://issues.apache.org/jira/browse/MAPREDUCE-5785
yarn-site.xml
yarn.scheduler.minimum-allocation-mb 512 YARN允許的最小Container
//AppMaster也會獨占一個Container
yarn.scheduler.maximum-allocation-mb 4096 YARN允許的最大Container
yarn.nodemanager.resource.memory-mb 36864 節點上資源的總物理內存值。
//這個值不要配置為節點總RAM,還要為其他Hadoop服務如Hbase等留內存
yarn.nodemanager.vmen-pmen-ratio 2.1 每個Container允許的虛擬內存比例。
yarn提供了非常通用的應用資源模型。
- 資源名稱(主機名稱、機架名稱、以及可能的復雜網絡拓撲)
- 內存量
- CPU(核數/類型)
- 其他資源,如disk/network I/O、GPU等資源。
yarn權威指南上介紹hadoop2.x目前的可以支持CPU和內存兩種資源維度。(hadoop yarn權威指南P33)