用戶自行將 mapred.child.java.opts 設為 -Xmx4096m 導致 TaskTracker 記憶體耗盡、Swap 暴增、Load 飆升。本文提供管理員層面的限制方案。
mapred.child.java.opts 已棄用,新版區分 mapred.map.child.java.opts / mapred.reduce.child.java.opts(預設 -Xmx200m)mapred-site.xml 覆蓋預設值,無上限管控利用 JVM 參數「後定義覆蓋前定義」特性(-Xmx4000m -Xmx1000m 實際生效 1000m),在集群 mapred-site.xml 設定 admin 級參數:
<property>
<name>mapreduce.admin.map.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
<property>
<name>mapreduce.admin.reduce.child.java.opts</name>
<value>-Xmx1536m</value>
</property>
TaskTracker 構造 JVM 參數的調用鏈:
JobConf.getMapChildJavaOpts() →
TaskController.buildTaskJvmArgs() →
合併用戶 opts + admin opts(admin 在後) →
寫入 taskjvm.sh → bash 執行
因 admin 參數在後,用戶設定的 -Xmx4096m 會被 -Xmx1024m 覆蓋。