Ubuntu上 Hadoop 资源分配优化实操指南
一 系统层优化
- 资源预留与内核参数:为系统与应用预留内存,通常将约**75%**物理内存分配给 YARN,其余留给系统与其他进程;降低换页倾向,设置 vm.swappiness=10;提升文件句柄与网络队列:fs.file-max=655360、net.core.somaxconn=1024。
- 存储与调度:优先使用 SSD 作为 HDFS 数据盘,并将 dfs.datanode.data.dir 指向 SSD 挂载路径;磁盘 I/O 调度器建议:SSD 用 noop,机械盘用 deadline;为集群配置专用网络减少带宽争用。
- NUMA 与 BIOS:在 YARN 3.1.0+ 启用 NUMA 感知(如设置 yarn.nodemanager.numa-awareness.enabled=true);BIOS 中启用 CPU Performance 策略、升级网卡驱动并可考虑中断绑核,降低跨 NUMA 访问开销。
二 YARN 与容器资源计算
- 核心参数:设置 yarn.nodemanager.resource.memory-mb(节点可供 YARN 使用的内存,如16384 MB)、yarn.nodemanager.resource.cpu-vcores(如16);配置容器边界 yarn.scheduler.minimum-allocation-mb=2048、yarn.scheduler.maximum-allocation-mb=8192;调度器启用 DominantResourceCalculator 更精确匹配内存/CPU。
- 容器与并行度估算:
- 容器数量:NUM_container ≈ 可用内存 / 容器内存;NUM_container(vcore) ≈ 可用 vcore / 容器 vcore。
- 示例:若节点内存 16 GB、容器内存 4 GB,则约 4 个容器;若 vcore 16、容器 vcore 2,则约 8 个容器,实际受容器内存约束为 4 个。
- 容器内存与 JVM:为 Map/Reduce 设置 mapreduce.{map|reduce}.memory.mb(如 4096/8192),并将 mapreduce.{map|reduce}.java.opts 设为容器内存的约 0.75–0.8(如 -Xmx3072m/-Xmx6144m),避免 OOM 并减少 GC 抖动。
- 快速参考配置示例(yarn-site.xml 片段):
- yarn.nodemanager.resource.memory-mb=16384
- yarn.nodemanager.resource.cpu-vcores=16
- yarn.scheduler.minimum-allocation-mb=2048
- yarn.scheduler.maximum-allocation-mb=8192
- yarn.scheduler.capacity.resource-calculator=org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
三 MapReduce 与 HDFS 关键参数
- MapReduce:启用中间数据压缩 mapreduce.map.output.compress=true(推荐 Snappy/LZO);在合适场景使用 Combiner 减少 Shuffle 数据量;合理设置 mapreduce.job.maps/reduces 或交由框架自适应;提升 Shuffle 并行度与缓冲:mapreduce.reduce.shuffle.parallelcopies、merge.percent、input.buffer.percent;必要时开启 JVM 重用(如 mapred.job.reuse.jvm.num.tasks=-1)。
- HDFS:根据数据规模与访问模式调整块大小 dfs.blocksize(如 256MB/512MB),降低 NameNode 元数据压力与小文件开销;副本因子 dfs.replication 在可靠性与带宽间权衡(常见 3,成本敏感可适度降低);提升 NameNode/DataNode 并发处理:dfs.namenode.handler.count、dfs.datanode.handler.count;优化数据布局与本地性,减少跨节点网络;对冷数据可归档为 HAR;启用压缩(如 Snappy/LZO)降低 I/O 与网络。
四 数据布局与压缩策略
- 数据本地化:通过 mapreduce.job.locality.wait 控制任务等待本地数据的时长(如 3–30 秒),优先在计算节点本地执行 Map 任务,显著降低网络传输。
- 高效数据格式:使用列式存储 ORC/Parquet,结合谓词下推、列裁剪减少扫描与 I/O。
- 分区与倾斜治理:按时间/地区等维度分区,确保数据均匀分布,避免数据倾斜导致部分节点过载。
- 压缩策略:对 Map 输出与最终输出启用压缩(如 Snappy/LZO),在压缩率与 CPU 开销间取得平衡。
五 监控 排错与容量规划
- 监控与验证:通过 NameNode Web UI(9870) 与 YARN ResourceManager(8088) 观察资源分配、队列与作业进度;使用 Ambari/Cloudera Manager 或 Prometheus+Grafana 持续监控 CPU/内存/磁盘/网络;分析 JobHistory Server 与容器日志定位慢任务与瓶颈。
- 内存不足排查:用 free -h、vmstat、top/ps 观察内存与进程;在 /etc/sysctl.conf 中设置 vm.swappiness=10 并
sysctl -p 生效;必要时清理 PageCache(如 echo 1 | sudo tee /proc/sys/vm/drop_caches);在 Hadoop 侧合理设置 yarn.nodemanager.resource.memory-mb、mapreduce.{map|reduce}.memory.mb 与 JVM 堆,并优先使用 SSD 与增加内存。
- 容量规划建议:结合业务增长为 NameNode/ResourceManager 预留充足内存;对 DataNode 采用多盘 JBOD 或合理 RAID0;按“容器内存 ≈ 0.75–0.8 × 容器内存上限、容器 vcore 与内存配比均衡”的原则迭代调优,避免资源碎片与过度分配。