温馨提示×

linux hadoop如何调优

小樊
45
2026-09-04 15:39:41
栏目: 智能运维

在 Linux 上运行 Hadoop(通常是 Hadoop 集群,包括 HDFS + YARN/MapReduce)时,“调优”一般从 操作系统层、HDFS 层、YARN/MapReduce 层、JVM 层、网络与磁盘 I/O 几个维度来做。下面按实战角度给你一个较系统的调优清单。


一、Linux 系统层调优(基础但非常关键)

1. 文件描述符 & 进程数

Hadoop 会打开大量文件(尤其 NameNode、DataNode)。

# 查看
ulimit -n
ulimit -u

# 修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536

2. 禁用 swap(重要)

swap 会导致 JVM GC 停顿严重。

# 临时
swapoff -a

# 永久:注释 /etc/fstab 中 swap 行

3. 文件系统与挂载参数

  • 推荐使用 ext4 / xfs
  • 挂载参数示例:
mount -o noatime,nodiratime,data=writeback /

noatime 能明显减少磁盘访问。

4. 磁盘 I/O 调度器

对 HDD:

echo deadline > /sys/block/sda/queue/scheduler

对 SSD:

echo noop > /sys/block/sda/queue/scheduler

5. 网络参数

# /etc/sysctl.conf
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 300
sysctl -p

二、HDFS 调优

1. NameNode 内存

hdfs-site.xml:

<property>
  <name>dfs.namenode.handler.count</name>
  <value>40</value>
</property>

NameNode 堆内存(在 hadoop-env.sh):

export HADOOP_NAMENODE_OPTS="-Xmx8g"

经验:

  • 每 100 万 block ≈ 1GB 内存

2. DataNode 参数

<property>
  <name>dfs.datanode.handler.count</name>
  <value>20</value>
</property>

<property>
  <name>dfs.datanode.max.transfer.threads</name>
  <value>8192</value>
</property>

3. 块大小(影响吞吐)

大文件场景:

<property>
  <name>dfs.blocksize</name>
  <value>256m</value>
</property>

4. 副本数

<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
  • 性能优先可降为 2
  • 可靠性优先保持 3

三、YARN 调优(资源调度核心)

1. 内存与 CPU 配置

yarn-site.xml:

<property>
  <name>yarn.nodemanager.resource.memory-mb</name>
  <value>61440</value>
</property>

<property>
  <name>yarn.nodemanager.resource.cpu-vcores</name>
  <value>16</value>
</property>

2. Container 最小/最大限制

<property>
  <name>yarn.scheduler.minimum-allocation-mb</name>
  <value>1024</value>
</property>

<property>
  <name>yarn.scheduler.maximum-allocation-mb</name>
  <value>16384</value>
</property>

3. 避免资源碎片化

  • 合理设置 container 大小
  • 使用 Capacity Scheduler 或 Fair Scheduler

四、MapReduce 调优

1. Map / Reduce 数量

<property>
  <name>mapreduce.job.maps</name>
  <value>auto</value>
</property>

<property>
  <name>mapreduce.job.reduces</name>
  <value>自动 ≈ 0.95 * reduce slot</value>
</property>

经验:

  • map 数 ≈ 输入数据量 / block size
  • reduce 数 ≈ 集群 reduce 槽位 × 0.95

2. JVM 重用(小任务明显)

<property>
  <name>mapreduce.job.jvm.numtasks</name>
  <value>10</value>
</property>

3. Combine / Compression

mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec

五、JVM 调优

mapred-env.sh / yarn-env.sh:

-export HADOOP_HEAPSIZE=4096

常见 JVM 参数:

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200

六、常见性能问题排查

1. 慢任务(Straggler)

  • 开启 speculative execution
<property>
  <name>mapreduce.map.speculative</name>
  <value>true</value>
</property>

2. 磁盘满

  • DataNode 磁盘不平衡
hdfs balancer

3. 网络瓶颈

  • 使用千兆/万兆网卡
  • 避免跨机架 shuffle

七、推荐调优顺序(实战)

  1. Linux 系统参数(文件数、swap、磁盘)
  2. HDFS 稳定性(NameNode 内存、block size)
  3. YARN 资源分配(最关键)
  4. MapReduce 参数
  5. JVM & 压缩
  6. 监控(Ganglia / Prometheus / JMX)

如果你愿意,可以告诉我:

  • Hadoop 版本(2.x / 3.x)
  • 集群规模(几台、什么配置)
  • 主要跑什么任务(MR / Spark / Hive)

我可以直接给你一套 可复制的配置文件参数。

0 踩