Ubuntu环境下解决Hadoop内存问题的系统化方案
dfs.datanode.data.dir)、NameNode目录(dfs.namenode.name.dir)挂载到SSD分区,提升数据读写速度(SSD的IOPS约为HDD的100倍),减少因磁盘IO瓶颈导致的内存压力。Hadoop的内存配置需根据集群硬件资源和任务类型调整,核心参数如下:
yarn-site.xml):
yarn.nodemanager.resource.memory-mb:NodeManager可分配给容器的总内存(需小于等于节点物理内存,建议为物理内存的70%-80%,避免内存溢出)。yarn.scheduler.minimum-allocation-mb:单个容器可申请的最小内存(如1024MB,避免小任务占用过多资源);yarn.scheduler.maximum-allocation-mb:单个容器可申请的最大内存(如8192MB,防止单个任务占用过多内存导致节点崩溃)。mapred-site.xml):
mapreduce.map.memory.mb:Map任务的容器内存(如2048MB,根据Map任务的数据处理量调整);mapreduce.reduce.memory.mb:Reduce任务的容器内存(如4096MB,Reduce任务通常需要更多内存处理聚合数据);mapreduce.map.java.opts/mapreduce.reduce.java.opts:Map/Reduce任务的JVM堆大小(建议为容器内存的70%-80%,如Map任务设为-Xmx1638m,Reduce任务设为-Xmx3276m,避免堆内存溢出)。Error: Java heap space错误,需增大JVM堆内存。可通过两种方式配置:
export HADOOP_OPTS="-Xmx4096m"(设置JVM最大堆内存为4GB);mapred-site.xml文件,添加<property><name>mapreduce.map.java.opts</name><value>-Xmx4096m</value></property>(针对Map任务)和<property><name>mapreduce.reduce.java.opts</name><value>-Xmx8192m</value></property>(针对Reduce任务)。mapreduce.job.locality.wait参数设置为合理值(如30s,等待数据本地化的最长时间),避免因等待本地数据导致任务延迟。50070、ResourceManager端口8088)查看内存使用情况(如NodeManager的内存分配、Map/Reduce任务的容器内存占用);或使用第三方工具(如Ganglia、Prometheus+Granafa)监控集群内存、CPU、磁盘等指标,实时定位内存瓶颈。yarn logs -applicationId <应用ID>)中的OutOfMemoryError或Java heap space错误,针对性调整对应任务的内存配置。hdfs-site.xml的dfs.blocksize参数设置。mapreduce.map.output.compress=true)和最终输出(mapreduce.output.fileoutputformat.compress=true)启用Snappy或Gzip压缩,减少内存中的数据量(压缩率约为3-5倍),提升处理效率。