1. Hadoop集群搭建概述
作为一名长期从事大数据平台搭建的工程师,我深知Hadoop集群配置的重要性。一个配置不当的集群,轻则影响性能,重则导致数据丢失。本文将基于Hadoop 3.4.3版本,详细讲解生产环境集群搭建的全过程。
Hadoop集群主要由HDFS和YARN两大核心组件构成。HDFS负责分布式存储,YARN负责资源调度。在实际部署中,我们需要考虑硬件选型、网络拓扑、安全认证等多个维度。虽然本文以非安全模式为例,但生产环境强烈建议配置Kerberos认证。
2. 环境准备与规划
2.1 硬件需求
典型的生产集群至少需要3台物理服务器:
- 1台NameNode + ResourceManager(主节点)
- 2台DataNode + NodeManager(工作节点)
对于存储密集型场景,建议:
- NameNode:64GB内存,SSD系统盘
- DataNode:根据数据量配置多块HDD数据盘(建议单盘4TB以上)
2.2 软件依赖
必须预先安装:
- JDK 8或11(推荐OpenJDK)
- SSH服务(用于节点间通信)
- 统一的时区配置(避免日志时间错乱)
重要提示:所有节点必须保持时钟同步,建议配置NTP服务。我在实际部署中遇到过因时间不同步导致的YARN应用提交失败问题。
3. 核心配置文件详解
3.1 core-site.xml配置
这是Hadoop最基础的配置文件,需要重点关注:
<configuration> <!-- NameNode地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://namenode:8020</value> </property> <!-- 临时文件目录 --> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> <!-- IO缓冲区大小 --> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>3.2 hdfs-site.xml配置
NameNode配置要点:
<property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/hdfs/nn</value> </property> <property> <name>dfs.blocksize</name> <value>268435456</value> <!-- 256MB --> </property>DataNode配置技巧:
<property> <name>dfs.datanode.data.dir</name> <value>/data1/hadoop/hdfs/dn,/data2/hadoop/hdfs/dn</value> </property>多磁盘配置可以提升IO吞吐量,我在实际测试中发现,4块磁盘并行写入可使HDFS写性能提升2-3倍。
3.3 yarn-site.xml关键参数
ResourceManager内存配置:
<property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>16384</value> <!-- 16GB --> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>24576</value> <!-- 24GB --> </property>日志聚合配置(强烈建议开启):
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/tmp/logs</value> </property>4. 集群部署实战
4.1 系统用户创建
安全起见,应为不同服务创建专用用户:
# 创建HDFS专用用户 useradd -r -s /bin/false hdfs # 创建YARN专用用户 useradd -r -s /bin/false yarn # 创建MapReduce专用用户 useradd -r -s /bin/false mapred4.2 目录权限设置
确保关键目录权限正确:
mkdir -p /data/hadoop/{tmp,hdfs/nn,hdfs/dn} chown -R hdfs:hadoop /data/hadoop chmod 755 /data/hadoop4.3 首次启动流程
- 格式化NameNode(仅首次):
sudo -u hdfs hdfs namenode -format- 启动HDFS集群:
sudo -u hdfs start-dfs.sh- 启动YARN集群:
sudo -u yarn start-yarn.sh- 验证集群状态:
hdfs dfsadmin -report yarn node -list5. 运维与监控
5.1 健康检查脚本示例
创建/usr/local/bin/node-health-check.sh:
#!/bin/bash # 检查磁盘空间 DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%') if [ $DISK_USAGE -gt 90 ]; then echo "ERROR: Root partition usage $DISK_USAGE%" exit 1 fi # 检查内存使用 FREE_MEM=$(free -m | awk 'NR==2 {print $4}') if [ $FREE_MEM -lt 1024 ]; then echo "ERROR: Low free memory $FREE_MEM MB" exit 1 fi exit 0在yarn-site.xml中配置:
<property> <name>yarn.nodemanager.health-checker.script.path</name> <value>/usr/local/bin/node-health-check.sh</value> </property>5.2 关键监控指标
建议监控以下核心指标:
- HDFS:
- 剩余存储空间
- 丢失块数量
- DataNode存活数
- YARN:
- 可用vCores
- 待处理应用数
- 容器失败率
6. 性能调优经验
6.1 内存配置黄金法则
根据我的经验,合理的内存分配比例应为:
- NodeManager总内存 = 物理内存 × 0.8
- 单个容器内存 = NodeManager内存 ÷ vCore数 × 0.9
例如32GB内存、16核的节点:
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>24576</value> <!-- 32GB×0.8=25.6GB --> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>1440</value> <!-- 25.6GB÷16×0.9≈1.44GB --> </property>6.2 网络优化技巧
在千兆网络环境下,建议调整:
<!-- hdfs-site.xml --> <property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property> <!-- yarn-site.xml --> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>16</value> <!-- 与物理核数一致 --> </property>7. 常见问题排查
7.1 DataNode无法注册
现象:NameNode网页显示DataNode数量不足
排查步骤:
- 检查DataNode日志:
tail -n 100 /var/log/hadoop/hdfs/hadoop-hdfs-datanode-*.log - 验证网络连通性:
telnet namenode 8020 - 检查防火墙规则:
iptables -L -n
7.2 YARN应用卡住
现象:应用长时间处于ACCEPTED状态
解决方案:
- 检查资源队列:
yarn queue -status default - 增加调度器资源:
<property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.5</value> </property>
8. 生产环境建议
经过多个项目的实践验证,我总结出以下经验:
- 至少部署3个JournalNode实现高可用
- 为NameNode配置SSD存储提升元数据操作性能
- 定期执行HDFS平衡操作(hdfs balancer)
- 启用HDFS快照功能保护关键数据
- 配置ResourceManager HA避免单点故障
最后提醒:所有配置变更后,务必先在测试环境验证,再应用到生产环境。我在某次直接修改生产集群配置的经历,曾导致整个集群不可用近2小时。