1. Hadoop完全分布式环境搭建概述
第一次接触Hadoop集群部署的新手常会陷入各种配置文件的迷宫。三年前我带队实施某物流企业大数据平台时,曾用整整两天时间排查因主机名解析导致的DataNode注册失败问题。本文将基于这些实战经验,带你避开那些官方文档不会告诉你的"坑",从零构建一个可立即投入生产的Hadoop 3.x完全分布式集群。
完全分布式模式意味着每个Hadoop组件都运行在独立的物理节点上,这与伪分布式模式(所有进程在同一台机器)有本质区别。你需要准备至少3台节点(1个NameNode + 2个DataNode),生产环境建议5节点起步。以下是我们的测试集群规划:
| 节点类型 | 主机名 | IP地址 | 主要进程 |
|---|---|---|---|
| Master | hadoop101 | 192.168.1.101 | NameNode, ResourceManager |
| Slave1 | hadoop102 | 192.168.1.102 | DataNode, NodeManager |
| Slave2 | hadoop103 | 192.168.1.103 | DataNode, NodeManager |
2. 基础环境准备
2.1 系统配置标准化
所有节点需统一使用CentOS 7.6+最小化安装。实测发现CentOS 8的防火墙规则会导致YARN容器通信异常,这是RedHat官方已知问题。关键配置步骤如下:
bash复制# 关闭SELinux(需重启生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 配置hosts映射(所有节点相同)
cat >> /etc/hosts <<EOF
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
EOF
警告:hosts文件必须确保所有节点完全一致!我曾遇到因某节点hosts缺少一条记录导致整个集群无法启动的情况。
2.2 JDK环境部署
Hadoop 3.x需要JDK 8+,推荐使用OpenJDK 11。采用tar包方式安装便于多版本管理:
bash复制# 解压到/opt/module(所有节点相同操作)
tar -zxvf jdk-11.0.15_linux-x64_bin.tar.gz -C /opt/module/
# 配置环境变量
echo 'export JAVA_HOME=/opt/module/jdk-11.0.15' >> /etc/profile
echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile
source /etc/profile
验证安装时不要只用java -version,还需检查JAVA_HOME是否生效:
bash复制[ $(echo $JAVA_HOME) == "/opt/module/jdk-11.0.15" ] && echo "OK" || echo "FAIL"
3. Hadoop集群部署实战
3.1 软件包分发与解压
在主节点下载hadoop-3.3.4.tar.gz,配置好后分发到从节点:
bash复制# 主节点操作
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
tar -zxvf hadoop-3.3.4.tar.gz -C /opt/module/
cd /opt/module && mv hadoop-3.3.4 hadoop
# 同步到从节点
scp -r /opt/module/hadoop hadoop102:/opt/module/
scp -r /opt/module/hadoop hadoop103:/opt/module/
3.2 核心配置文件详解
进入$HADOOP_HOME/etc/hadoop目录,这些配置文件需要重点修改:
1. workers(原slaves文件)
code复制hadoop102
hadoop103
2. core-site.xml
xml复制<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop/data/tmp</value>
</property>
</configuration>
3. hdfs-site.xml
xml复制<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop101:9868</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
4. yarn-site.xml
xml复制<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
</configuration>
经验:修改配置文件后,建议使用
diff工具对比各节点配置一致性,这是排查集群问题的第一步。
3.3 集群启动与验证
1. 首次启动必须格式化NameNode
bash复制hdfs namenode -format
2. 启动HDFS
bash复制start-dfs.sh
3. 启动YARN
bash复制start-yarn.sh
验证集群状态的关键命令:
bash复制# 检查HDFS
hdfs dfsadmin -report
# 检查YARN
yarn node -list
# 检查所有Java进程
jps
预期输出示例:
code复制[hadoop101]$ jps
4166 NameNode
4482 ResourceManager
[hadoop102]$ jps
3210 DataNode
3341 NodeManager
[hadoop103]$ jps
3178 DataNode
3289 NodeManager
4. 故障排查手册
4.1 DataNode无法注册
现象:NameNode的web界面显示Live Nodes为0
排查步骤:
- 检查所有DataNode的
/opt/module/hadoop/logs/hadoop-root-datanode-*.log - 确认所有节点的
core-site.xml中fs.defaultFS配置一致 - 使用
telnet hadoop101 8020测试端口连通性 - 检查
/etc/hosts是否配置了所有节点IP映射
4.2 YARN任务提交失败
现象:提交MapReduce作业时报错"Could not find or load main class"
解决方案:
bash复制# 在yarn-site.xml中添加
<property>
<name>yarn.application.classpath</name>
<value>
/opt/module/hadoop/etc/hadoop,
/opt/module/hadoop/share/hadoop/common/*,
/opt/module/hadoop/share/hadoop/common/lib/*,
/opt/module/hadoop/share/hadoop/hdfs/*,
/opt/module/hadoop/share/hadoop/hdfs/lib/*,
/opt/module/hadoop/share/hadoop/mapreduce/*,
/opt/module/hadoop/share/hadoop/mapreduce/lib/*,
/opt/module/hadoop/share/hadoop/yarn/*,
/opt/module/hadoop/share/hadoop/yarn/lib/*
</value>
</property>
4.3 磁盘空间不足告警
预防措施:
xml复制<!-- 在hdfs-site.xml中配置 -->
<property>
<name>dfs.datanode.du.reserved</name>
<value>10737418240</value> <!-- 保留10GB空间 -->
</property>
5. 性能调优建议
5.1 内存配置基准
根据服务器物理内存调整(以32GB内存为例):
1. NameNode
bash复制# 在hadoop-env.sh
export HDFS_NAMENODE_OPTS="-Xmx12g -Xms12g"
2. DataNode
bash复制export HDFS_DATANODE_OPTS="-Xmx4g -Xms4g"
5.2 YARN容器配置
xml复制<!-- yarn-site.xml -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>24576</value> <!-- 24GB -->
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value> <!-- 8GB/容器 -->
</property>
5.3 HDFS块大小优化
对于视频分析等大文件场景:
xml复制<!-- hdfs-site.xml -->
<property>
<name>dfs.blocksize</name>
<value>268435456</value> <!-- 256MB -->
</property>
最后提醒:每次修改配置后,需要滚动重启服务。先重启从节点,最后重启主节点,这是保证集群高可用的最佳实践。