sysctl
命令設置vm.swappiness=0
(禁止使用swap),并編輯/etc/sysctl.conf
永久生效。vm.overcommit_memory
為2
(嚴格模式,避免過度分配內存),vm.overcommit_ratio
設為2
(允許超過物理內存的2%用于分配),平衡內存利用率與系統穩定性。hadoop-env.sh
中設置HADOOP_NAMENODE_OPTS
,例如:export HADOOP_NAMENODE_OPTS="-Xms4g -Xmx8g" # 初始堆內存4GB,最大堆內存8GB(根據服務器內存調整,通常為物理內存的1/2~3/4)
hdfs-site.xml
中設置dfs.datanode.handler.count
(DataNode處理請求的線程數),例如:<property>
<name>dfs.datanode.handler.count</name>
<value>50</value> # 根據集群規模調整(如100節點集群可設為50~100)
</property>
<property>
<name>dfs.blocksize</name>
<value>256m</value>
</property>
yarn.nodemanager.resource.memory-mb
定義每個NodeManager可用的物理內存(如8GB內存節點設為8192
),需預留10%~20%給系統和其他服務:<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
yarn.scheduler.maximum-allocation-mb
定義單個YARN任務可申請的最大內存(通常為NodeManager內存的1/2,如4096
),避免單個任務占用過多內存:<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
yarn-site.xml
中禁用:<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
mapreduce.map.memory.mb
(Map任務內存)和mapreduce.reduce.memory.mb
(Reduce任務內存)需根據任務復雜度調整(如Map任務處理小數據可設為1GB,Reduce任務處理聚合數據可設為2GB)。對應的JVM堆內存需小于任務內存(留10%給系統):<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1536m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1536m</value>
</property>
reduce
函數作為Combiner),降低Shuffle階段的內存傳輸壓力。TestDFSIO
(測試HDFS IO性能)、TeraSort
(測試MapReduce排序性能)等工具模擬業務負載,根據測試結果調整內存參數(如增加Reduce任務內存以縮短排序時間)。以上策略需根據集群規模(如節點數量、內存大?。?、業務需求(如數據量、任務類型)和硬件配置靈活調整,建議在測試環境中驗證后再應用于生產環境。