Ubuntu Hadoop 性能调优技巧
一 硬件与操作系统层优化
- 优先使用SSD作为 HDFS 数据盘,并将 HDFS 数据目录配置到 SSD;为NameNode/DataNode配置充足内存,保证元数据与块读写性能。
- 提升网络带宽与降低时延:为集群配置专用网络,避免与其他业务争用;在 Ubuntu 上优化 TCP 参数(如 net.core.somaxconn、net.ipv4.tcp_max_syn_backlog)以提升吞吐。
- 存储控制器与磁盘策略:多盘优先 JBOD 或合理配置 RAID0(视可靠性与场景而定);SSD 使用 noop 调度器,机械盘使用 deadline 调度器。
- BIOS/固件与驱动:启用 CPU Performance 策略;必要时关闭 SMMU、调整 CPU 预取;升级网卡驱动并开启中断绑核减少跨 NUMA 访问。
- 充分利用 NUMA:在 YARN 3.1.0+ 启用 NUMA 感知(如设置 yarn.nodemanager.numa-awareness.enabled=true),减少跨片内存访问开销。
二 HDFS 层优化
- 合理设置块大小:默认 128MB,可根据数据规模与访问模式增大(如 256MB 或更高),以降低 NameNode 元数据压力并减少小文件开销。
- 调整副本因子:默认 3,在可靠性与网络带宽之间权衡;带宽紧张或成本敏感时可适度降低,计算密集且容错要求高时可提高。
- 提升并发处理:增大 dfs.namenode.handler.count 与 dfs.datanode.handler.count,提升 NameNode 与 DataNode 的请求处理能力。
- 优化数据布局与本地性:确保计算尽量在数据所在节点执行(数据本地化),减少网络传输;对冷数据进行**归档(HAR)**以优化存储与扫描性能。
- 启用压缩(如 Snappy/LZO)用于中间数据与输出数据,降低 I/O 与网络传输量。
三 YARN 与 MapReduce 层优化
- 资源与调度:设置 yarn.nodemanager.resource.memory-mb(通常预留约**75%**物理内存给 YARN),合理配置 yarn.scheduler.minimum-allocation-mb 与 yarn.scheduler.maximum-allocation-mb;调度器采用 DominantResourceCalculator 更精确匹配内存/CPU 资源。
- 容器与并行度:按节点资源计算容器数量(NUM_container ≈ 可用内存/容器内存,NUM_container(vcore) ≈ 可用 vcore/容器 vcore);为 Map/Reduce 设置合适的 mapreduce.{map|reduce}.memory.mb 与 mapreduce.{map|reduce}.cpu.vcores。
- JVM 与内存:将 mapreduce.{map|reduce}.java.opts 设置为容器内存的约 0.75–0.8,避免 OOM 且减少 GC 抖动。
- Shuffle 与网络:提升 mapreduce.reduce.shuffle.parallelcopies、mapreduce.reduce.shuffle.merge.percent、mapreduce.reduce.shuffle.input.buffer.percent 等参数以加速 Reduce 拉取与合并。
- 并行度与压缩:合理设置 mapreduce.job.maps/reduces 或让框架自适应;启用 mapreduce.map.output.compress 与 mapreduce.output.fileoutputformat.compress,常用 Snappy/LZO 平衡压缩率与 CPU。
- 本地性与等待:通过 mapreduce.job.locality.wait 控制任务等待本地数据的时长,减少跨节点网络开销。
- JVM 重用:设置 mapred.job.reuse.jvm.num.tasks(如 -1 表示无限制)以减少 JVM 启停开销。
四 快速参考配置示例
<!-- yarn-site.xml -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>16384</value> <!-- 约 16GB,按节点内存 75% 估算 -->
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>16</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
<!-- hdfs-site.xml -->
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>40</value> <!-- 可按集群规模调整 -->
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>
<!-- mapred-site.xml -->
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3072m</value> <!-- 约 0.75 × 容器内存 -->
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144m</value>
</property>
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.job.locality.wait</name>
<value>30000</value>
</property>
以上为示例值,需结合节点内存、CPU、磁盘数与业务特征压测后微调。
五 监控与持续优化
- 使用 Ambari 或 Cloudera Manager 进行集群可视化监控与告警;结合 Ganglia/Prometheus 收集指标,定期分析 NameNode/DataNode/YARN 日志定位瓶颈。
- 建立基准测试与回归测试(如周期性运行 Terasort、WordCount),以量化调参收益并避免性能退化。
- 采用小步快跑的调参策略:一次只调整少量参数,控制变量法验证;在业务低峰期进行变更并保留回滚方案。
- 结合数据倾斜与小文件治理(合并、归档、合理分区),并持续评估压缩算法与块大小的适配性。