hadoop 集群部署
你现在需要的是一份基于 3 个节点部署 Hadoop 3.3.5 完全分布式集群 的完整指南,我会把节点规划、环境准备、配置修改、集群启动和验证都讲清楚,步骤清晰且适配新手操作。
一、集群规划(3节点)
先明确 3 个节点的角色分工(推荐配置):
| 节点主机名 | IP 示例 | 角色 |
|---|---|---|
| node1 | 192.168.65.110 | NameNode、ResourceManager |
| node2 | 192.168.65.111 | DataNode、NodeManager |
| node3 | 192.168.65.112 | DataNode、NodeManager、SecondaryNameNode |
注意:所有操作先在 node1 完成,再同步到 node2、node3,避免重复工作。
二、全节点环境准备(必做)
1. 基础环境统一(所有节点执行)
# 1. 关闭防火墙和 SELinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 2. 配置主机名(每个节点对应修改)
# node1 执行
hostnamectl set-hostname node1
# node2 执行
hostnamectl set-hostname node2
# node3 执行
hostnamectl set-hostname node3
# 3. 配置 hosts 文件(所有节点执行,IP 替换为你的实际地址)
cat >> /etc/hosts << EOF
192.168.65.110 node1
192.168.65.111 node2
192.168.65.112 node3
EOF
# 4. 安装依赖(所有节点)
yum install -y wget ntpdate net-tools
# 同步时间(避免集群时间不一致)
ntpdate ntp.aliyun.com
2. 创建 hadoop 用户并配置免密登录(所有节点)
# 1. 创建 hadoop 用户(所有节点)
useradd hadoop && passwd hadoop # 密码建议统一,如 hadoop123
echo "hadoop ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# 2. 切换到 hadoop 用户,生成密钥(仅 node1 执行)
su - hadoop
ssh-keygen -t rsa # 一路回车,不设置密码
# 3. 免密登录所有节点(包括自身,node1 执行)
ssh-copy-id hadoop@node1
ssh-copy-id hadoop@node2
ssh-copy-id hadoop@node3
# 测试免密登录(node1 执行,无密码提示即成功)
ssh node2
ssh node3
3. 安装 JDK 8(所有节点)
su - hadoop
# 安装 OpenJDK 8
sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
# 配置 JAVA_HOME(所有节点)
echo "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk" >> ~/.bashrc
echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> ~/.bashrc
source ~/.bashrc
# 验证
java -version # 输出 JDK 8 版本即可
三、Hadoop 安装与配置(核心步骤)
1. 下载解压 Hadoop(仅 node1 执行,之后同步到其他节点)
su - hadoop
# 创建安装目录
mkdir -p /usr/local/hadoop
# 下载 Hadoop 3.3.5
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz
# 解压
tar -zxvf hadoop-3.3.5.tar.gz -C /usr/local/hadoop --strip-components=1
# 配置 HADOOP_HOME
echo "export HADOOP_HOME=/usr/local/hadoop" >> ~/.bashrc
echo "export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin" >> ~/.bashrc
source ~/.bashrc
# 验证
hadoop version # 输出 3.3.5 版本即可
2. 同步 Hadoop 目录到 node2、node3(node1 执行)
su - hadoop
scp -r /usr/local/hadoop node2:/usr/local/
scp -r /usr/local/hadoop node3:/usr/local/
# 同步环境变量(node2、node3 执行)
echo "export HADOOP_HOME=/usr/local/hadoop" >> ~/.bashrc
echo "export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin" >> ~/.bashrc
source ~/.bashrc
3. 修改核心配置文件(仅 node1 执行,之后同步到其他节点)
所有配置文件路径:/usr/local/hadoop/etc/hadoop/
(1)hadoop-env.sh(指定 JAVA_HOME 和用户)
# 编辑文件
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 添加/修改以下内容
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export HDFS_NAMENODE_USER="hadoop"
export HDFS_DATANODE_USER="hadoop"
export HDFS_SECONDARYNAMENODE_USER="hadoop"
export YARN_RESOURCEMANAGER_USER="hadoop"
export YARN_NODEMANAGER_USER="hadoop"
(2)core-site.xml(默认文件系统 + 临时目录)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- NameNode RPC 地址(node1:9000) -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<!-- Hadoop 临时目录(所有节点需手动创建) -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<!-- 关闭权限检查(新手测试) -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
(3)hdfs-site.xml(HDFS 核心配置)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 副本数(3节点设为 2,避免单节点故障) -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- NameNode Web UI 端口(3.x 默认为 9870) -->
<property>
<name>dfs.namenode.http-address</name>
<value>node1:9870</value>
</property>
<!-- SecondaryNameNode 地址(指定 node3) -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node3:50090</value>
</property>
<!-- 关闭权限检查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
</configuration>
(4)yarn-site.xml(YARN 配置)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- ResourceManager 地址(node1) -->
<property>
<name>yarn.resourcemanager.address</name>
<value>node1:8032</value>
</property>
<!-- ResourceManager Web UI 地址 -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>node1:8088</value>
</property>
<!-- NodeManager 附属服务(必须配置) -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间(小时) -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 适配容器内存 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
</configuration>
(5)mapred-site.xml(MapReduce 配置)
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- MapReduce 运行在 YARN 上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MapReduce Web UI 端口 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<!-- 开启历史服务器 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
</configuration>
(6)workers(指定 DataNode/NodeManager 节点)
# 编辑文件
vim /usr/local/hadoop/etc/hadoop/workers
# 删除原有内容,添加以下节点(node2、node3 作为从节点)
node2
node3
4. 同步配置文件到 node2、node3(node1 执行)
su - hadoop
scp /usr/local/hadoop/etc/hadoop/* node2:/usr/local/hadoop/etc/hadoop/
scp /usr/local/hadoop/etc/hadoop/* node3:/usr/local/hadoop/etc/hadoop/
5. 创建临时目录(所有节点执行)
su - hadoop
mkdir -p /usr/local/hadoop/tmp
chmod 755 /usr/local/hadoop/tmp
四、集群启动与验证
1. 格式化 NameNode(仅 node1 执行,仅首次!)
su - hadoop
hdfs namenode -format
# 成功标志:最后输出 "Exiting with status 0"
2. 启动集群(node1 执行)
# 启动 HDFS
start-dfs.sh
# 启动 YARN
start-yarn.sh
# 启动历史服务器(可选)
mr-jobhistory-daemon.sh start historyserver
3. 验证集群状态
(1)检查进程(各节点执行 jps)
- node1 应看到:
NameNode、ResourceManager、JobHistoryServer - node2 应看到:
DataNode、NodeManager - node3 应看到:
DataNode、NodeManager、SecondaryNameNode
(2)检查端口/访问 Web UI
- HDFS Web UI:
http://node1:9870(查看 DataNode 是否在线) - YARN Web UI:
http://node1:8088(查看 NodeManager 是否在线) - 历史服务器:
http://node1:19888
(3)命令行验证
# 创建 HDFS 目录
hdfs dfs -mkdir /test
# 上传文件
hdfs dfs -put ~/.bashrc /test
# 查看文件(应能看到)
hdfs dfs -ls /test
# 运行官方示例(验证 MapReduce)
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.5.jar pi 2 5
五、常见问题解决
- DataNode 未启动:
- 检查
tmp目录权限; - 若提示
clusterID 不匹配,删除所有节点的tmp目录,重新格式化 NameNode。
- 检查
- NodeManager 未启动:
- 检查
yarn-site.xml中yarn.nodemanager.aux-services配置是否正确; - 查看日志:
$HADOOP_HOME/logs/yarn-hadoop-nodemanager-*.log。
- 检查
- Web UI 无法访问:
- 确认节点 IP/主机名能解析;
- 确认防火墙已关闭。
总结
- 3节点集群核心是角色分工(1个主节点+2个从节点),需保证所有节点环境统一、免密登录正常;
- 配置文件的核心是指定
NameNode(node1)、ResourceManager(node1)、SecondaryNameNode(node3)的地址; - 启动前必须格式化 NameNode(仅首次),启动后通过进程、Web UI、命令行三层验证集群可用性。
浙公网安备 33010602011771号