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 应看到:NameNodeResourceManagerJobHistoryServer
  • node2 应看到:DataNodeNodeManager
  • node3 应看到:DataNodeNodeManagerSecondaryNameNode
(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

五、常见问题解决

  1. DataNode 未启动
    • 检查 tmp 目录权限;
    • 若提示 clusterID 不匹配,删除所有节点的 tmp 目录,重新格式化 NameNode。
  2. NodeManager 未启动
    • 检查 yarn-site.xmlyarn.nodemanager.aux-services 配置是否正确;
    • 查看日志:$HADOOP_HOME/logs/yarn-hadoop-nodemanager-*.log
  3. Web UI 无法访问
    • 确认节点 IP/主机名能解析;
    • 确认防火墙已关闭。

总结

  1. 3节点集群核心是角色分工(1个主节点+2个从节点),需保证所有节点环境统一、免密登录正常;
  2. 配置文件的核心是指定 NameNode(node1)、ResourceManager(node1)、SecondaryNameNode(node3)的地址;
  3. 启动前必须格式化 NameNode(仅首次),启动后通过进程、Web UI、命令行三层验证集群可用性。
posted @ 2026-03-02 13:05  wuyingchun1987  阅读(0)  评论(0)    收藏  举报