Hadoop 集群部署与调优
概述
集群部署不是"装好能跑"就结束,而是硬件选型、角色规划、参数配置、监控告警、日志排查的系统工程。本文按"规划 → 部署 → 配置 → 监控 → 排障"的顺序展开,给出可落地的清单与调优思路。
一、硬件选型与角色规划
1.1 节点角色规划
| 角色 | 建议节点数 | 硬件特点 |
|---|---|---|
| NameNode(HA 主备) | 2 | 高内存(元数据在内存)、中等 CPU |
| ResourceManager(HA) | 2 | 中等配置 |
| JournalNode | 3 | 中等配置 |
| DataNode / NodeManager | 根据规模 5~N | 高磁盘、高内存、中高 CPU |
| ZooKeeper | 3(奇数为佳) | 低配置、稳定 |
1.2 硬件选型建议
| 组件 | 建议 |
|---|---|
| CPU | DataNode 16~32 核,计算节点可更高 |
| 内存 | NameNode 64GB+,DataNode 与内存容量 1:2~1:4 |
| 磁盘 | DataNode 多块盘(4~12 块),SATA 即可,RAID 建议不做(副本冗余) |
| 网络 | 千兆起步,万兆更好;跨机架带宽决定 Shuffle 性能 |
1.3 部署拓扑示例(6 节点)
node1: NameNode(Active) + ResourceManager + JournalNode + ZK
node2: NameNode(Standby) + ResourceManager(Standby) + JournalNode + ZK
node3: JournalNode + ZooKeeper
node4: DataNode + NodeManager
node5: DataNode + NodeManager
node6: DataNode + NodeManager二、部署步骤
2.1 前置准备
bash
# 1. 基础环境(所有节点)
# 时钟同步(NTP/chrony)
# SSH 免密(NameNode → 各节点)
# 关闭防火墙与 SELinux
# 修改 hosts 与系统文件句柄
ulimit -n 65535
# 2. 安装 JDK 并配置 JAVA_HOME2.2 安装与配置
bash
# 下载解压 Hadoop(所有节点统一目录)
tar -zxvf hadoop-3.3.6.tar.gz -C /opt
ln -s /opt/hadoop-3.3.6 /opt/hadoop
# 配置环境变量
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin核心配置文件($HADOOP_HOME/etc/hadoop/):
| 文件 | 内容 |
|---|---|
core-site.xml | 默认文件系统、ZK 地址等 |
hdfs-site.xml | NameNode 地址、副本数、HA 配置 |
yarn-site.xml | RM 地址、调度器、NM 资源 |
mapred-site.xml | MapReduce 框架与历史服务器 |
workers | DataNode / NodeManager 节点清单 |
hadoop-env.sh | JVM 参数 |
2.3 格式化与启动
bash
# 首次初始化(仅一次)
hdfs namenode -format
# 启动 HDFS 与 YARN
start-dfs.sh
start-yarn.sh
# 验证
hdfs dfsadmin -report
jps # 各角色进程非首次启动:
start-dfs.sh即可;HA 场景需先启动 JournalNode 与 ZooKeeper。
三、核心配置参数
3.1 HDFS 关键参数
xml
<!-- hdfs-site.xml -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value> <!-- 128MB -->
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value> <!-- NameNode RPC 处理线程数 -->
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>| 参数 | 说明 | 调优要点 |
|---|---|---|
dfs.replication | 副本数 | 默认 3,冷数据可降 |
dfs.blocksize | 块大小 | 大文件用大块减少元数据 |
dfs.namenode.handler.count | NN 并发处理 | 大集群可提升到 100+ |
dfs.namenode.heap.size | NN 堆内存 | 每百万文件约 1GB |
3.2 YARN 关键参数
xml
<!-- yarn-site.xml -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>49152</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>24</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
</property>调度器(Capacity/Fair)的配置在
capacity-scheduler.xml/fair-scheduler.xml。
3.3 通用调优原则
- 资源参数必须匹配硬件:NM 资源总量 ≤ 节点物理资源(预留 OS 与 NN 开销)
- 堆内存与 YARN 分开看:NameNode/DataNode 堆由
HADOOP_HEAPSIZE控制,作业容器由 YARN 控制 - 一次调一个变量:调优前后对比指标,避免多变量耦合
四、JMX 监控
4.1 开启 JMX
Hadoop 各角色原生暴露 JMX,通过 HTTP 端口访问:
bash
# NameNode JMX 地址(默认 9870 为 Web UI)
curl http://node1:9870/jmx
# DataNode
curl http://node4:9864/jmx4.2 关键监控指标
| 指标 | 含义 | 告警阈值 |
|---|---|---|
dfs.namenode.FSNamesystemState.CapacityUsed | 已用容量 | 超 80% 告警 |
dfs.namenode.FSNamesystemState.MissingBlocks | 缺失块数 | 非 0 即告警 |
dfs.namenode.NameNodeStatus.State | NN 状态 | 非 active 告警 |
dfs.namenode.FSNamesystemState.PendingReplicationBlocks | 待复制块 | 持续增长告警 |
dfs.namenode.FSNamesystemState.UnderReplicatedBlocks | 副本不足块 | 持续增长告警 |
yarn.resourcemanager.ClusterMetrics | 可用/使用内存、活跃节点数 | 活跃节点减少告警 |
4.3 采集方案
Hadoop JMX HTTP 接口
│
▼
Prometheus (jmx_exporter / hadoop_exporter)
│
▼
Grafana 看板 + AlertManager 告警生产环境建议:HDFS 与 YARN 的可用性、容量、块健康三类指标必须纳入告警。
五、日志排查
5.1 日志位置
| 角色 | 日志路径 | 关键文件 |
|---|---|---|
| NameNode | $HADOOP_HOME/logs/ | hadoop-hdfs-namenode-<host>.log |
| DataNode | 同上 | hadoop-hdfs-datanode-<host>.log |
| ResourceManager | $HADOOP_HOME/logs/ | yarn-resourcemanager-<host>.log |
| 作业日志 | YARN 聚合 | yarn logs -applicationId <id> |
5.2 排查方法
bash
# 按关键字过滤异常
grep -i "error\|exception\|fatal" hadoop-hdfs-namenode-*.log
# 查看作业日志
yarn logs -applicationId application_xxx
# 查看 NameNode 健康
hdfs dfsadmin -report
hdfs dfsadmin -metasave /tmp/meta.txt # 输出 NameNode 内部状态5.3 常见故障速查
| 现象 | 定位方向 | 处理 |
|---|---|---|
| 集群不可写 | NN 进入安全模式 / 块损坏 | 检查 MissingBlocks 与元数据 |
| 作业失败率高 | YARN 资源不足 / 节点掉线 | 看 RM 日志与节点心跳 |
| 磁盘写满 | DataNode 空间不足 | 清理/扩容,观察 CapacityUsed |
| 超时错误 | RPC 超时 / 网络抖动 | 调大 handler.count 或超时参数 |
| GC 停顿 | NameNode 堆过大/过大对象 | 检查 NN 堆配置与 GC 日志 |
六、性能调优要点
6.1 存储层
- 大文件优先大块(256MB),减少元数据与调度开销
- 冷数据用纠删码降低存储成本
- 定期运行 balancer 均衡数据分布
6.2 计算层
- Map/Reduce 容器内存与 YARN 配额匹配,避免容器被杀
- 合理设置 Reduce 数量(约 1.5~2 倍 Map 数的比例)与分区均衡
- 大作业拆分到队列,避免阻塞其他作业
6.3 网络层
- 机架感知(topology.script)开启,保证副本分布与本地性
- Shuffle 量大时提升节点间带宽
七、部署检查清单
| 阶段 | 检查项 |
|---|---|
| 规划 | 角色分配、硬件容量、网络带宽 |
| 部署 | 时钟同步、SSH、防火墙、JDK 版本 |
| 配置 | 核心配置项与硬件匹配、HA 与调度器 |
| 启动 | 各角色进程齐全、无异常日志 |
| 验证 | 写读测试、副本数正确、balancer 状态 |
| 监控 | JMX 指标接入、告警规则配置 |
| 备份 | FsImage 定期备份、元数据安全 |
参考链接: