一口气完成 Hadoop 全分布式集群 | 运维工程师的速通笔记

1. 环境说明

节点
IP
角色
hadoop01
192.168.227.132
NameNode + ResourC++eManager
hadoop02
192.168.227.133
DataNode + NodeManager + SecondaryNameNode
hadoop03
192.168.227.134
DataNode + NodeManager

所有节点已安装同版本 CentOS 7/8,普通用户 hadoop 具备 sudo 权限。 创建hadoop用户

# 1. 创建用户并设置密码
sudo useradd -m -s /bin/bash hadoop
echo "hadoop:hadoop123" | sudo chpasswd   # hadoop123密码可自行修改

# 2. 加入 wheel 组(CentOS/RHEL)
sudo usermod -aG wheel hadoop

# 3. 确保 wheel 组可免密 sudo(仅第一次需执行)
sudo sed -i 's/^# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers

# 4. 验证
su - hadoop
sudo whoami   # 预期输出 root

2. 统一 hosts 与免密登录

2.1 同步 hosts(所有节点

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF

2.2 生成并分发密钥(仅需一次

# 在 hadoop01 / hadoop02 / hadoop03 依次执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for h in hadoop01 hadoop02 hadoop03; do
  ssh-copy-id -o StrictHostKeyChecking=no $h
done



命令解释:

### 1. `ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa`
- `ssh-keygen`:生成 SSH 密钥对。
- `-t rsa`:指定算法为 RSA(老习惯,现在更推荐 ed25519,但 Hadoop 生态里 RSA 依旧常见)。
- `-P ''`:设置私钥的**密码短语(passphrase)为空**,即免输入。
- `-f ~/.ssh/id_rsa`:把私钥/公钥文件写到默认位置 `~/.ssh/id_rsa`(私钥)和 `~/.ssh/id_rsa.pub`(公钥)。

执行后,当前用户就有了自己的「钥匙」:  
- 私钥:`~/.ssh/id_rsa`(留在本机,权限 600)  
- 公钥:`~/.ssh/id_rsa.pub`(可以分发给别人)

---

### 2. `for h in hadoop01 hadoop02 hadoop03; do ... done`
- 一个 Bash 循环,把后面那行命令依次对 `hadoop01、hadoop02、hadoop03` 执行一遍。

---

### 3. `ssh-copy-id -o StrictHostKeyChecking=no $h`
- `ssh-copy-id`:把当前用户的公钥追加到远程主机 `$h` 的 `~/.ssh/authorized_keys` 文件里,实现免密登录。
- `-o StrictHostKeyChecking=no`:第一次连接时不提示 `The authenticity of host ... can't be established`,直接自动写入 known_hosts。  
  **注意**:生产环境如果担心中间人攻击,可以去掉此参数手动验证指纹;但在自动化脚本里很常见。

---

验证:

ssh hadoop02 'echo ✔ SSH 免密成功'

3. 目录与安装包准备

3.1 统一目录结构(所有节点

sudo mkdir -p /export/{servers,software}
#数据存放路径
mkdir -p /data1/hadoop/dn
mkdir -p /data2/hadoop/dn
mkdir -p /data3/hadoop/dn
sudo chown -R $(whoami) /export


3.2 上传安装包(任选其一

  • Xshell/Xftp 图形拖拽
  • scp 命令
  • 一行 rz(需 yum -y install lrzsz

需要以下两个包:

  • jdk-8u461-Linux-x64.tar.gz
  • hadoop-2.10.2.tar.gz

4. JDK 一键安装脚本

保存为 install_jdk.sh所有节点执行:

#!/bin/bash
set -e
cd /export/software
tar -zxf jdk-8u461-linux-x64.tar.gz -C /export/servers/
mv /export/servers/jdk1.8.0_461 /usr/lib/jdk

cat >> /etc/profile.d/Java.sh <<'EOF'
export JAVA_HOME=/usr/lib/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
source /etc/profile.d/java.sh
java -version

执行权限:

chmod +x install_jdk.sh && ./install_jdk.sh

5. Hadoop 安装与环境变量

5.1 解压与软链(所有节点

cd /export/software
tar -zxf hadoop-2.10.2.tar.gz -C /export/servers/
ln -snf /export/servers/hadoop-2.10.2 /export/servers/hadoop

5.2 环境变量

cat >> /etc/profile.d/hadoop.sh <<'EOF'
export HADOOP_HOME=/export/servers/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
EOF
source /etc/profile.d/hadoop.sh
hadoop version

6. 六大核心配置文件(逐行中文备注,照抄即可)

以下操作只在 hadoop01 执行,随后 7.7 节一键同步到其它节点。

6.1 指定 JDK 路径 —— hadoop-env.sh

# 直接替换文件中的 JAVA_HOME 一行
sed -i '/^export JAVA_HOME=/c\export JAVA_HOME=/usr/lib/jdk' \
    $HADOOP_CONF_DIR/hadoop-env.sh

6.2 核心公共参数 —— core-site.xml

在 <configuration> 内填入:

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
0

6.3 HDFS 特有参数 —— hdfs-site.xml

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
1


6.4 MapReduce 运行框架 —— mapred-site.xml

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
2
sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
3

6.5 YARN 框架参数 —— yarn-site.xml

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
4

6.6 集群节点列表 —— slaves

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
5

7. 集群同步与格式化

7.1 一键分发

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
6

7.2 格式化 NameNode(仅在 hadoop01

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
7

8. 启动、验证、UI 访问

8.1 启动集群

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
8

8.2 进程检查

sudo tee /etc/hosts <<'EOF'
192.168.227.132 hadoop01
192.168.227.133 hadoop02
192.168.227.134 hadoop03
EOF
9

8.3 关闭防火墙(所有节点

# 在 hadoop01 / hadoop02 / hadoop03 依次执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for h in hadoop01 hadoop02 hadoop03; do
  ssh-copy-id -o StrictHostKeyChecking=no $h
done



命令解释:

### 1. `ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa`
- `ssh-keygen`:生成 SSH 密钥对。
- `-t rsa`:指定算法为 RSA(老习惯,现在更推荐 ed25519,但 Hadoop 生态里 RSA 依旧常见)。
- `-P ''`:设置私钥的**密码短语(passphrase)为空**,即免输入。
- `-f ~/.ssh/id_rsa`:把私钥/公钥文件写到默认位置 `~/.ssh/id_rsa`(私钥)和 `~/.ssh/id_rsa.pub`(公钥)。

执行后,当前用户就有了自己的「钥匙」:  
- 私钥:`~/.ssh/id_rsa`(留在本机,权限 600)  
- 公钥:`~/.ssh/id_rsa.pub`(可以分发给别人)

---

### 2. `for h in hadoop01 hadoop02 hadoop03; do ... done`
- 一个 Bash 循环,把后面那行命令依次对 `hadoop01、hadoop02、hadoop03` 执行一遍。

---

### 3. `ssh-copy-id -o StrictHostKeyChecking=no $h`
- `ssh-copy-id`:把当前用户的公钥追加到远程主机 `$h` 的 `~/.ssh/authorized_keys` 文件里,实现免密登录。
- `-o StrictHostKeyChecking=no`:第一次连接时不提示 `The authenticity of host ... can't be established`,直接自动写入 known_hosts。  
  **注意**:生产环境如果担心中间人攻击,可以去掉此参数手动验证指纹;但在自动化脚本里很常见。

---

0

8.4 Windows 本地 hosts

在 C:\Windows\System32\drivers\etc\hosts 追加:

# 在 hadoop01 / hadoop02 / hadoop03 依次执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for h in hadoop01 hadoop02 hadoop03; do
  ssh-copy-id -o StrictHostKeyChecking=no $h
done



命令解释:

### 1. `ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa`
- `ssh-keygen`:生成 SSH 密钥对。
- `-t rsa`:指定算法为 RSA(老习惯,现在更推荐 ed25519,但 Hadoop 生态里 RSA 依旧常见)。
- `-P ''`:设置私钥的**密码短语(passphrase)为空**,即免输入。
- `-f ~/.ssh/id_rsa`:把私钥/公钥文件写到默认位置 `~/.ssh/id_rsa`(私钥)和 `~/.ssh/id_rsa.pub`(公钥)。

执行后,当前用户就有了自己的「钥匙」:  
- 私钥:`~/.ssh/id_rsa`(留在本机,权限 600)  
- 公钥:`~/.ssh/id_rsa.pub`(可以分发给别人)

---

### 2. `for h in hadoop01 hadoop02 hadoop03; do ... done`
- 一个 Bash 循环,把后面那行命令依次对 `hadoop01、hadoop02、hadoop03` 执行一遍。

---

### 3. `ssh-copy-id -o StrictHostKeyChecking=no $h`
- `ssh-copy-id`:把当前用户的公钥追加到远程主机 `$h` 的 `~/.ssh/authorized_keys` 文件里,实现免密登录。
- `-o StrictHostKeyChecking=no`:第一次连接时不提示 `The authenticity of host ... can't be established`,直接自动写入 known_hosts。  
  **注意**:生产环境如果担心中间人攻击,可以去掉此参数手动验证指纹;但在自动化脚本里很常见。

---

1

8.5 Web UI

  • HDFS:http://hadoop01:50070
  • YARN:http://hadoop01:8088

9. 验证是否可以上传数据

# 在 hadoop01 / hadoop02 / hadoop03 依次执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for h in hadoop01 hadoop02 hadoop03; do
  ssh-copy-id -o StrictHostKeyChecking=no $h
done



命令解释:

### 1. `ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa`
- `ssh-keygen`:生成 SSH 密钥对。
- `-t rsa`:指定算法为 RSA(老习惯,现在更推荐 ed25519,但 Hadoop 生态里 RSA 依旧常见)。
- `-P ''`:设置私钥的**密码短语(passphrase)为空**,即免输入。
- `-f ~/.ssh/id_rsa`:把私钥/公钥文件写到默认位置 `~/.ssh/id_rsa`(私钥)和 `~/.ssh/id_rsa.pub`(公钥)。

执行后,当前用户就有了自己的「钥匙」:  
- 私钥:`~/.ssh/id_rsa`(留在本机,权限 600)  
- 公钥:`~/.ssh/id_rsa.pub`(可以分发给别人)

---

### 2. `for h in hadoop01 hadoop02 hadoop03; do ... done`
- 一个 Bash 循环,把后面那行命令依次对 `hadoop01、hadoop02、hadoop03` 执行一遍。

---

### 3. `ssh-copy-id -o StrictHostKeyChecking=no $h`
- `ssh-copy-id`:把当前用户的公钥追加到远程主机 `$h` 的 `~/.ssh/authorized_keys` 文件里,实现免密登录。
- `-o StrictHostKeyChecking=no`:第一次连接时不提示 `The authenticity of host ... can't be established`,直接自动写入 known_hosts。  
  **注意**:生产环境如果担心中间人攻击,可以去掉此参数手动验证指纹;但在自动化脚本里很常见。

---

2