NiceZack头像

Hadoop 部署全流程教程:从新装 CentOS 到伪分布式与完全分布式

1. 目标与前提

本篇教程假设你刚刚完成一台 CentOS 的最小化安装,系统还没有配置业务环境。我们将从环境准备开始,逐步完成 JDK 安装、Hadoop 安装与配置文件编写,最终分别演示两种部署方式:

  • 伪分布式模式:所有 Hadoop 守护进程运行在同一台机器上,适合学习和开发调试。
  • 完全分布式模式:NameNode、ResourceManager、DataNode、NodeManager 分散部署在多台服务器上,更接近真实生产环境。

本文以 CentOS 7/8/Stream 和 Hadoop 3.3.x 为主要环境,其他版本操作基本一致,只需替换对应软件包即可。

2. 环境准备与节点规划

伪分布式只需要一台机器;完全分布式建议准备至少 3 台机器。为了方便演示,我们统一做如下规划:

主机名IP 地址角色
hadoop01192.168.1.101NameNode、ResourceManager
hadoop02192.168.1.102DataNode、NodeManager
hadoop03192.168.1.103DataNode、NodeManager

如果你的实验环境只有一台机器,可以先完成伪分布式部署;后面进入完全分布式章节时,再把 3 台机器的基础环境准备好。

3. 基础系统配置

3.1 关闭防火墙和 SELinux

Hadoop 集群在启动、运行过程中需要大量端口通信。为了减少排查成本,实验环境建议先关闭防火墙和 SELinux。生产环境则应按需开放端口并配置安全策略。

# 停止并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
临时关闭 SELinux
setenforce 0
永久关闭 SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

3.2 设置主机名和 hosts

Hadoop 组件之间会通过主机名相互访问,因此必须保证主机名、IP 和 hosts 映射一致。分别在每台机器上执行:

# 在 hadoop01 上设置主机名
hostnamectl set-hostname hadoop01
在 hadoop02 上设置主机名
hostnamectl set-hostname hadoop02
在 hadoop03 上设置主机名
hostnamectl set-hostname hadoop03

然后在每台机器的 /etc/hosts 文件中增加如下内容:

192.168.1.101 hadoop01
192.168.1.102 hadoop02
192.168.1.103 hadoop03

执行 ping hadoop01、ping hadoop02、ping hadoop03 验证互相能够解析到正确地址。

3.3 安装基础工具

yum install -y wget vim net-tools openssh-clients rsync

4. 创建 Hadoop 用户并配置 SSH 免密

Hadoop 不建议直接使用 root 用户运行。我们在每台机器上创建统一的 hadoop 用户,并配置该用户之间的 SSH 免密登录。

# 创建 hadoop 用户,并设置密码
useradd hadoop
passwd hadoop
赋予 hadoop 用户 sudo 权限
echo "hadoop ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

切换到 hadoop 用户,生成密钥并把公钥分发到包括自己在内的所有节点:

su - hadoop
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
在每台机器上执行,把公钥复制到目标机器
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03

完成后执行 ssh hadoop02,如果能免密登录则说明配置成功。伪分布式模式下只需配置 ssh-copy-id hadoop01 让本机可以免密访问自己。

5. 安装 JDK

Hadoop 运行依赖 Java 环境。以 JDK 8 为例,先在官网下载 jdk-8uXXX-linux-x64.tar.gz,上传到服务器后执行:

# 创建安装目录
sudo mkdir -p /usr/local/java
解压 JDK,注意替换实际文件名
sudo tar -zxf jdk-8u351-linux-x64.tar.gz -C /usr/local/java
配置环境变量
sudo vim /etc/profile

在 /etc/profile 末尾追加:

export JAVA_HOME=/usr/local/java/jdk1.8.0_351
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

保存后使配置生效并验证:

source /etc/profile
java -version

如果输出 JDK 版本信息,说明 Java 环境已经可用。

6. 下载并安装 Hadoop

以 Hadoop 3.3.6 为例,下载二进制包并解压到统一目录:

# 下载 Hadoop 3.3.6
wget https://archive.apache.org/dist/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
解压
sudo tar -zxf hadoop-3.3.6.tar.gz -C /usr/local
重命名并调整属主
sudo mv /usr/local/hadoop-3.3.6 /usr/local/hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop
配置环境变量
sudo vim /etc/profile

在 /etc/profile 末尾追加:

export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

使配置生效:

source /etc/profile
hadoop version

7. 配置 Hadoop 核心环境

下面几个文件是 Hadoop 伪分布式和完全分布式都会用到的,可以先统一配置。

7.1 配置 hadoop-env.sh

vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh

找到并修改 Java 环境变量:

export JAVA_HOME=/usr/local/java/jdk1.8.0_351

7.2 配置 core-site.xml

编辑 $HADOOP_HOME/etc/hadoop/core-site.xml,在 <configuration> 内添加:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop01:9000</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/data/tmp</value>
  </property>
</configuration>

其中 fs.defaultFS 指定默认文件系统;hadoop.tmp.dir 指定临时数据目录,伪分布式和完全分布式都需要提前创建该目录。

7.3 配置 hdfs-site.xml

编辑 $HADOOP_HOME/etc/hadoop/hdfs-site.xml。伪分布式模式建议使用如下配置:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/local/hadoop/data/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/usr/local/hadoop/data/datanode</value>
  </property>
</configuration>

完全分布式模式中,dfs.replication 建议设置为真实副本数,例如 2 或 3。

7.4 配置 mapred-site.xml

默认目录下通常只有一个模板文件 mapred-site.xml 不存在,可以通过复制模板或直接新建:

cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml
vim $HADOOP_HOME/etc/hadoop/mapred-site.xml

添加 YARN 执行框架配置:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

7.5 配置 yarn-site.xml

编辑 $HADOOP_HOME/etc/hadoop/yarn-site.xml,添加如下配置:

<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop01</value>
  </property>
</configuration>

如果只是学习伪分布式且不运行 MapReduce 任务,可以先不启用 YARN;但为了完整演示,这里统一配置 YARN。

8. 伪分布式部署与验证

伪分布式模式下,NameNode、SecondaryNameNode、DataNode、ResourceManager 和 NodeManager 都运行在同一台机器上。若你只有一台机器,把主机名按 hadoop01 配置即可。

8.1 创建数据目录并格式化 NameNode

mkdir -p /usr/local/hadoop/data/tmp
mkdir -p /usr/local/hadoop/data/namenode
mkdir -p /usr/local/hadoop/data/datanode
首次启动前格式化 NameNode
hdfs namenode -format

看到 Storage directory ... has been successfully formatted 表示格式化成功。格式化只能执行一次,重复格式化会生成新的集群 ID。

8.2 启动 HDFS 和 YARN

# 启动 HDFS
$HADOOP_HOME/sbin/start-dfs.sh
启动 YARN
$HADOOP_HOME/sbin/start-yarn.sh

如果是 Hadoop 3.x,也可以通过 start-all.sh 同时启动 HDFS 和 YARN,但官方更推荐分别启动,便于单独定位问题。

8.3 检查进程和端口

jps

伪分布式正常启动后,通常会看到如下进程:

  • NameNode
  • SecondaryNameNode
  • DataNode
  • ResourceManager
  • NodeManager

也可以通过 Web UI 访问 NameNode 和 ResourceManager:

  • NameNode:http://hadoop01:9870
  • ResourceManager:http://hadoop01:8088

8.4 运行 WordCount 验证

# 在 HDFS 中创建输入目录
hdfs dfs -mkdir -p /user/hadoop/input
准备测试文本
echo "hello hadoop hello world" > /tmp/wordcount.txt
hdfs dfs -put /tmp/wordcount.txt /user/hadoop/input
运行 MapReduce WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /user/hadoop/input /user/hadoop/output
查看统计结果
hdfs dfs -cat /user/hadoop/output/part-r-00000

如果能输出每个单词的出现次数,说明伪分布式 Hadoop 已经可以正常运行 MapReduce 任务。

9. 完全分布式部署

完全分布式模式下,我们使用 3 台机器,hadoop01 作为管理节点运行 NameNode 和 ResourceManager,hadoop02、hadoop03 作为工作节点运行 DataNode 和 NodeManager。

9.1 完成 3 台机器的基础准备

按照第 2 到第 6 节,分别在 3 台机器上完成以下配置:

  • 主机名与 hosts 映射。
  • 创建 hadoop 用户。
  • 配置 SSH 免密登录。
  • 安装 JDK。
  • 安装并解压 Hadoop 到统一目录。

9.2 配置 workers 文件

编辑 $HADOOP_HOME/etc/hadoop/workers,写入所有 DataNode 节点的主机名:

hadoop02
hadoop03

9.3 调整完全分布式配置

在 hadoop01 上修改 hdfs-site.xml,将副本数调整为 2:

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/usr/local/hadoop/data/namenode</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/usr/local/hadoop/data/datanode</value>
  </property>
</configuration>

其他配置文件保持第 7 节中的配置即可。注意 core-site.xml、yarn-site.xml 中的主机名都要指向 hadoop01。

9.4 分发配置到所有节点

# 将配置好的 Hadoop 目录同步到 hadoop02 和 hadoop03
rsync -avz --delete $HADOOP_HOME/ hadoop@hadoop02:$HADOOP_HOME/
rsync -avz --delete $HADOOP_HOME/ hadoop@hadoop03:$HADOOP_HOME/

9.5 创建目录并格式化 NameNode

在每台机器上创建相应数据目录:

# hadoop01 执行
mkdir -p /usr/local/hadoop/data/tmp /usr/local/hadoop/data/namenode
hadoop02 和 hadoop03 执行
mkdir -p /usr/local/hadoop/data/tmp /usr/local/hadoop/data/datanode

然后在 hadoop01 上格式化 NameNode:

hdfs namenode -format

9.6 启动完全分布式集群

# 在 hadoop01 上启动 HDFS,脚本会根据 workers 文件远程启动 DataNode
$HADOOP_HOME/sbin/start-dfs.sh
启动 YARN
$HADOOP_HOME/sbin/start-yarn.sh

9.7 验证集群状态

分别在 3 台机器上执行 jps 检查进程:

  • hadoop01 应看到 NameNode、SecondaryNameNode、ResourceManager。
  • hadoop02 和 hadoop03 应看到 DataNode、NodeManager。

也可以执行 hdfs dfsadmin -report 查看 DataNode 是否全部在线:

hdfs dfsadmin -report

如果 Live datanodes (2) 显示为 2,说明两个 DataNode 都已正常注册。继续上传文件:

hdfs dfs -mkdir -p /test
hdfs dfs -put /etc/hosts /test/hosts.txt
hdfs dfs -ls /test

再运行一次 WordCount,观察任务是否在 YARN 上调度执行:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount /test /test-output

10. 常见问题排查

10.1 集群节点无法互相免密登录

检查每台机器的 hosts 文件是否一致,确认公钥已复制到目标机器的 /home/hadoop/.ssh/authorized_keys,并确保该文件和 .ssh 目录权限正确。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

10.2 DataNode 无法启动或数量不足

常见原因是集群 ID 不一致。如果 NameNode 格式化过多次,DataNode 中保存的旧集群 ID 会导致注册失败。可以停止集群后清理 DataNode 数据目录中的 current 目录,再重新启动。

# 停止集群
$HADOOP_HOME/sbin/stop-all.sh
清理 DataNode 数据目录后重启
rm -rf /usr/local/hadoop/data/datanode/current

10.3 端口被占用或无法访问 Web UI

检查防火墙和 SELinux 是否已关闭,并使用 netstat -tlnp 查看 9000、9870、8088 等端口监听状态。若修改过配置文件,建议重启对应服务后再验证。

10.4 权限问题

Hadoop 数据目录应属于 hadoop 用户。如果曾使用 root 启动过服务,可能出现目录属主错误,可使用 chown -R hadoop:hadoop /usr/local/hadoop 修复。

11. 总结

本文从一台新装 CentOS 出发,完整介绍了 Hadoop 部署所需的基础环境配置、JDK 安装、Hadoop 配置方法,以及伪分布式和完全分布式两种部署模式。伪分布式适合单机快速学习;完全分布式更贴近生产环境,能够展示 NameNode、DataNode、ResourceManager 和 NodeManager 的分工协作。

在真实生产环境中,还需要进一步关注容量规划、数据目录多盘配置、高可用 NameNode、资源调度策略和安全认证等问题。建议在完全分布式跑通后,再逐步学习 HDFS 权限、YARN 队列以及集群监控等进阶内容。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/u010674283/article/details/169527246

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--