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任务内存以缩短排序时间)。以上策略需根据集群规模(如节点数量、内存大小)、业务需求(如数据量、任务类型)和硬件配置灵活调整,建议在测试环境中验证后再应用于生产环境。