目录

什么是 Hadoop?

1.Hadoop 的核心组件

2.Hadoop 的主要特点

3.Hadoop 的三种运行模式

准备Hadoop 集群

1. 环境准备与软件下载

2. JDK 与 Hadoop 解压配置

3. 环境变量配置

运行Hadoop 独立模式

结果验证与说明

运行伪分布式模式

1. 修改配置文件

2. 初始化 HDFS

3. 启动 HDFS 服务

4. 访问 Web 管理界面

5. 创建 HDFS 目录结构

6. 查看 HDFS Web 界面

7. 运行 MapReduce 作业

8. 查看作业结果

9. 停止 HDFS 服务

搭建 Hadoop 完全分布式集群(3 节点)

1. 环境准备与 NFS 共享配置

2. 配置 SSH 免密登录

3. 修改 Hadoop 配置文件

4. 初始化并启动集群

5. 测试集群功能

搭建计算资源调度

1. 配置 MapReduce 运行框架

2. 配置 YARN 资源管理器

3. 启动 YARN 服务

在线扩容

1. 新节点环境准备

2. 配置文件调整

3. 启动新节点服务

4. 验证扩容成功


什么是 Hadoop?

Hadoop 是一个开源的分布式计算框架,由 Apache 软件基金会开发和维护。它主要用于处理海量数据(大数据)的存储和计算问题,能够在成百上千台普通商用服务器组成的集群上可靠、可扩展地运行。

1.Hadoop 的核心组件

Hadoop 生态系统主要由以下核心组件构成:

  • HDFS(Hadoop Distributed File System):分布式文件系统,提供高吞吐量的数据访问,能够将大文件分割成多个块(默认128MB)并分布存储在集群的不同节点上。

  • MapReduce:分布式计算框架,采用"分而治之"的思想,将计算任务分解为 Map(映射)和 Reduce(归约)两个阶段,适合处理大规模数据集的并行计算。

  • YARN(Yet Another Resource Negotiator):资源管理和作业调度系统,负责集群资源的管理和分配。

2.Hadoop 的主要特点

  • 高可靠性:数据自动在集群中复制多份,防止单点故障。

  • 高扩展性:可通过增加节点线性扩展存储和计算能力。

  • 高容错性:能够自动检测和处理节点故障。

  • 低成本:可在普通商用硬件上运行,降低硬件成本。

  • 高效性:通过数据本地化处理减少网络传输开销。

3.Hadoop 的三种运行模式

1.本地模式(Local Mode):所有组件运行在单个JVM中,适合开发和调试。

2.伪分布式模式(Pseudo-Distributed Mode):所有守护进程运行在单台机器上,模拟分布式环境。

3.完全分布式模式(Fully Distributed Mode):真正的分布式部署,在多台机器上运行。

本文演示的是 Hadoop 的本地模式安装和运行,这是学习和测试 Hadoop 功能的最简单方式。


准备Hadoop 集群

本文详细记录在 CentOS/RHEL 系统上搭建 Hadoop 3.3.6 单机模式环境

1. 环境准备与软件下载

首先确保系统已安装必要的开发工具,然后下载 Hadoop 和 JDK:

# 查看当前目录下的文件
[root@server1 ~]# ls
anaconda-ks.cfg  hadoop-3.3.6.tar.gz  jdk-8u181-linux-x64.tar.gz
创建 hadoop 用户(建议使用专用用户运行 Hadoop)
[root@server1 ~]# useradd hadoop
将软件包移动到 hadoop 用户的家目录
[root@server1 ~]# mv hadoop-3.3.6.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop
切换到 hadoop 用户
[root@server1 ~]# su - hadoop

2. JDK 与 Hadoop 解压配置

以 hadoop 用户身份解压软件包并创建软链接:

[hadoop@server1 ~]$ ls
hadoop-3.3.6.tar.gz  jdk-8u181-linux-x64.tar.gz
解压 Hadoop 和 JDK
[hadoop@server1 ~]$ tar zxf hadoop-3.3.6.tar.gz
[hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
创建软链接方便后续引用
[hadoop@server1 ~]$ ln -s hadoop-3.3.6 hadoop
[hadoop@server1 ~]$ ln -s jdk1.8.0_181 jdk

3. 环境变量配置

配置 Java 环境变量和 Hadoop 环境:

# 编辑 .bash_profile 添加 JDK 到 PATH
[hadoop@server1 ~]$ vim .bash_profile
# 在文件末尾添加:
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/hadoop/jdk/bin
使配置生效
[hadoop@server1 ~]$ source .bash_profile
进入 Hadoop 配置目录
[hadoop@server1 hadoop]$ cd etc/
[hadoop@server1 etc]$ ls
hadoop
[hadoop@server1 etc]$ cd hadoop/
配置 Hadoop 环境变量,设置 JAVA_HOME
[hadoop@server1 hadoop]$ vim hadoop-env.sh
找到并修改 JAVA_HOME 配置:
export JAVA_HOME=/home/hadoop/jdk
确认当前目录
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
返回 Hadoop 安装根目录
[hadoop@server1 hadoop]$ cd ..
[hadoop@server1 etc]$ cd ..
查看 Hadoop 目录结构
[hadoop@server1 hadoop]$ ls
bin  include  libexec         licenses-binary  NOTICE-binary  README.txt  share
etc  lib      LICENSE-binary  LICENSE.txt      NOTICE.txt     sbin
测试 Hadoop 命令是否可用
[hadoop@server1 hadoop]$ bin/hadoop version

运行Hadoop 独立模式

需额外配置即可运行。我们使用 grep 示例程序:

# 创建输入目录
[hadoop@server1 hadoop]$ mkdir input
复制配置文件作为输入数据
[hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
查看输出结果
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
part-r-00000  _SUCCESS

运行 grep 示例程序
功能:在 input 目录的文件中搜索匹配 'dfs[a-z.]+' 正则表达式的行
参数说明:
- jar: 指定 MapReduce 示例程序 jar 包
- grep: 使用 grep 示例程序
- input: 输入目录
- output: 输出目录(会自动创建)
- 'dfs[a-z.]+': 搜索模式,匹配以 dfs 开头,后跟小写字母或点的字符串

结果验证与说明

运行结果说明:

  • _SUCCESS 文件:表示作业执行成功
  • part-r-00000 文件:包含 grep 作业的输出结果,格式为 "匹配到的文本\t出现次数"

查看具体结果:

[hadoop@server1 output]$ cat part-r-00000
1       dfsadmin

运行伪分布式模式

伪分布式模式是 Hadoop 在单台机器上模拟分布式环境运行的方式,所有守护进程(NameNode、DataNode、ResourceManager 等)都在同一台机器上启动,但使用分布式文件系统 HDFS 进行数据存储。以下是配置和运行伪分布式模式的详细步骤:

1. 修改配置文件

首先需要修改 Hadoop 的核心配置文件,启用 HDFS 并设置相关参数:

配置 core-site.xml:设置默认文件系统为 HDFS

[hadoop@server1 hadoop]$ cd etc/hadoop
[hadoop@server1 hadoop]$ vim core-site.xml
<configuration>
      <property>
            <name>fs.defaultFS</name>
            <value>hdfs://localhost:9000</value>
      </property>
</configuration>

配置 hdfs-site.xml:设置数据副本数量(伪分布式模式下设为 1)

[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
    <property>
          <name>dfs.replication</name>
          <value>1</value>
    </property>
</configuration>

配置 SSH 免密登录:Hadoop 需要 SSH 无密码访问本地主机

[hadoop@server1 hadoop]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[hadoop@server1 hadoop]$ ssh-copy-id localhost

2. 初始化 HDFS

在启动 HDFS 之前,需要格式化 NameNode:

[hadoop@server1 hadoop]$ cd /home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

注意:格式化操作会清空 HDFS 上的所有数据,仅在生产环境初始化或测试时执行。

3. 启动 HDFS 服务

使用以下命令启动 HDFS 守护进程:

[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [server1]

验证服务是否正常启动:

[hadoop@server1 hadoop]$ jps
4465 NameNode
4579 DataNode
4921 Jps
4765 SecondaryNameNode

应该能看到 NameNode、DataNode 和 SecondaryNameNode 进程。

4. 访问 Web 管理界面

HDFS 提供了一个 Web 管理界面,默认访问地址为:

http://<服务器IP>:9870

例如:http://192.168.223.181:9870/

在浏览器中访问该地址,可以查看集群状态、存储使用情况、节点信息等。

5. 创建 HDFS 目录结构

在 HDFS 上创建用户目录,为后续的 MapReduce 作业做准备:

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop

6. 查看 HDFS Web 界面

成功启动后,可以通过 Web 界面查看 HDFS 状态:

Hadoop HDFS Web 管理界面

7. 运行 MapReduce 作业

将本地文件上传到 HDFS,并运行 WordCount 示例程序:

创建输入目录并上传文件:

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input

验证文件上传成功:

[hadoop@server1 hadoop]$ bin/hdfs dfs -ls input
Found 10 items
-rw-r--r--   1 hadoop supergroup       9213 2026-08-22 21:05 input/capacity-scheduler.xml
-rw-r--r--   1 hadoop supergroup        884 2026-08-22 21:05 input/core-site.xml
-rw-r--r--   1 hadoop supergroup      11765 2026-08-22 21:05 input/hadoop-policy.xml
-rw-r--r--   1 hadoop supergroup        683 2026-08-22 21:05 input/hdfs-rbf-site.xml
-rw-r--r--   1 hadoop supergroup        867 2026-08-22 21:05 input/hdfs-site.xml
-rw-r--r--   1 hadoop supergroup        620 2026-08-22 21:05 input/httpfs-site.xml
-rw-r--r--   1 hadoop supergroup       3518 2026-08-22 21:05 input/kms-acls.xml
-rw-r--r--   1 hadoop supergroup        682 2026-08-22 21:05 input/kms-site.xml
-rw-r--r--   1 hadoop supergroup        758 2026-08-22 21:05 input/mapred-site.xml
-rw-r--r--   1 hadoop supergroup        690 2026-08-22 21:05 input/yarn-site.xml

运行 WordCount 作业:

[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output

8. 查看作业结果

作业完成后,将输出文件从 HDFS 复制到本地文件系统并查看结果:

[hadoop@server1 hadoop]$ bin/hdfs dfs -get output output
[hadoop@server1 hadoop]$ cat output/part-r-00000 | head -20

输出结果将显示每个单词及其在输入文件中出现的次数。

9. 停止 HDFS 服务

完成测试后,停止 HDFS 服务:

[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [server1]

验证服务已停止:

[hadoop@server1 hadoop]$ jps
6088 Jps

此时应该只看到 Jps 进程,HDFS 相关进程已全部停止。

总结:伪分布式模式是学习和测试 Hadoop 分布式功能的重要环节,它模拟了真实分布式环境的核心组件交互,为后续的完全分布式部署打下基础。通过本节的实践,您可以熟悉 HDFS 的基本操作、MapReduce 作业的提交流程,以及 Hadoop 集群的启停管理。

搭建 Hadoop 完全分布式集群(3 节点)

在完成伪分布式模式的实践后,我们可以进一步搭建一个真正的完全分布式 Hadoop 集群。本节将演示如何配置一个包含 3 个节点的 Hadoop 集群,其中 server1 作为主节点(NameNode),server2 和 server3 作为从节点(DataNode)。

1. 环境准备与 NFS 共享配置

首先,需要准备另外两台虚拟机(server2 和 server3),并在所有节点上禁用防火墙和 SELinux。然后,通过 NFS(Network File System)在主节点上共享 Hadoop 安装目录,以便从节点可以访问相同的软件环境。

在主节点(server1)上安装并配置 NFS 服务:

[root@server1 ~]# yum install -y nfs-utils
[root@server1 ~]# id hadoop
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[root@server1 ~]# vim /etc/exports
添加以下内容
/home/hadoop      *(rw,sync,anonuid=1000,anongid=1000)
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# systemctl enable nfs
[root@server1 ~]# showmount -e
Export list for server1:
/home/hadoop *

在从节点(server2 和 server3)上安装 NFS 客户端并挂载共享目录:

# 在 server2 上执行
[root@server2 ~]# useradd hadoop
[root@server2 ~]# echo 001003 | passwd --stdin hadoop
[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# showmount -e server1
Export list for server1:
/home/hadoop *
[root@server2 ~]# mount 192.168.223.181:/home/hadoop/ /home/hadoop/
[root@server2 ~]# df
Filesystem                   1K-blocks    Used Available Use% Mounted on
devtmpfs                       1001960       0   1001960   0% /dev
tmpfs                          1013948       0   1013948   0% /dev/shm
tmpfs                          1013948    9644   1004304   1% /run
tmpfs                          1013948       0   1013948   0% /sys/fs/cgroup
/dev/mapper/centos-root       49250820 1598964  47651856   4% /
/dev/sda1                      1038336  140272    898064  14% /boot
tmpfs                           202792       0    202792   0% /run/user/0
192.168.223.181:/home/hadoop  49251072 4272896  44978176   9% /home/hadoop
[root@server2 ~]# ll -d /home/hadoop/
drwx------ 6 hadoop hadoop 262 Aug 22 21:25 /home/hadoop/
[root@server2 ~]# id hadoop
uid=1000(hadoop) gid=1000(hadoop) groups=1000(hadoop)
[root@server2 ~]# su - hadoop
[hadoop@server2 ~]$ ls
hadoop  hadoop-3.3.6  hadoop-3.3.6.tar.gz  jdk  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

在 server3 上重复相同的配置步骤。

2. 配置 SSH 免密登录

确保主节点可以无密码 SSH 连接到所有从节点:

[hadoop@server1 ~]$ ssh server2
[hadoop@server1 ~]$ ssh server3

3. 修改 Hadoop 配置文件

进入 Hadoop 配置目录,修改核心配置文件以适应分布式环境:

[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ cd etc/hadoop/

修改 core-site.xml:

[hadoop@server1 hadoop]$ vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://server1:9000</value>
</property>
</configuration>

修改 hdfs-site.xml:

[hadoop@server1 hadoop]$ vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
</configuration>

配置 workers 文件(指定从节点):

[hadoop@server1 hadoop]$ vim workers
server2
server3

4. 初始化并启动集群

重新格式化 NameNode(注意:这会清空 HDFS 上的所有数据):

[hadoop@server1 hadoop]$ bin/hdfs namenode -format

启动 HDFS 服务:

[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server1]
Starting datanodes
Starting secondary namenodes [server1]

验证各节点进程:

# 在主节点 server1 上查看
[hadoop@server1 hadoop]$ jps
6753 NameNode
6978 SecondaryNameNode
7099 Jps
在从节点 server2 上查看
[hadoop@server2 ~]$ jps
4025 DataNode
4095 Jps
在从节点 server3 上查看
[hadoop@server3 ~]$ jps
1557 DataNode
1626 Jps

可以看到,NameNode 和 SecondaryNameNode 运行在 server1 上,DataNode 运行在 server2 和 server3 上。

Hadoop 完全分布式集群 Web 界面

5. 测试集群功能

在 HDFS 上创建目录结构并上传测试文件:

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input

HDFS 目录结构DataNode 状态

总结:至此,一个包含 3 个节点的 Hadoop 完全分布式集群已成功搭建。通过 NFS 共享软件目录简化了部署,配置文件指定了主从节点关系,HDFS 数据副本数设置为 2 以提高可靠性。您可以通过 Web 界面(http://server1:9870)监控集群状态,并运行 MapReduce 作业进行功能验证。

搭建计算资源调度

在完成 HDFS 分布式文件系统的部署后,接下来需要配置 YARN(Yet Another Resource Negotiator)资源管理器,以实现对集群计算资源的统一调度和管理。YARN 是 Hadoop 2.x 及更高版本引入的核心组件,负责管理集群中的计算资源,并为 MapReduce 等计算框架提供资源调度服务。

本节将在已搭建的完全分布式集群基础上,配置并启动 YARN 服务,使集群具备完整的计算资源调度能力。

1. 配置 MapReduce 运行框架

首先需要配置 MapReduce 以使用 YARN 作为资源调度框架。编辑 mapred-site.xml 配置文件:

[hadoop@server1 hadoop]$ vim etc/hadoop/mapred-site.xml

添加以下配置内容:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
    </property>
</configuration>

关键配置说明:

  • mapreduce.framework.name:设置为 yarn,表示使用 YARN 作为 MapReduce 作业的资源调度器

  • mapreduce.application.classpath:指定 MapReduce 应用程序的类路径,确保作业能够找到所需的依赖库

2. 配置 YARN 资源管理器

接下来配置 YARN 的核心参数。编辑 yarn-site.xml 配置文件:

[hadoop@server1 hadoop]$ vim etc/hadoop/yarn-site.xml

添加以下配置内容:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
    </property>
</configuration>

关键配置说明:

  • yarn.nodemanager.aux-services:设置 NodeManager 的辅助服务为 mapreduce_shuffle,这是 MapReduce 作业运行所必需的洗牌(shuffle)服务

  • yarn.nodemanager.env-whitelist:指定 NodeManager 可以传递给容器的环境变量白名单,确保容器能够访问必要的 Hadoop 环境变量

3. 启动 YARN 服务

配置完成后,在主节点(server1)上启动 YARN 服务:

[hadoop@server1 hadoop]$ sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers

启动成功后,在各节点上使用 jps 命令验证服务状态:

# 在主节点 server1 上查看
[hadoop@server1 hadoop]$ jps
6753 NameNode
7553 ResourceManager
6978 SecondaryNameNode
7861 Jps
在从节点 server2 上查看
[hadoop@server2 ~]$ jps
4246 NodeManager
4343 Jps
4025 DataNode
在从节点 server3 上查看
[hadoop@server3 ~]$ jps
1780 NodeManager
1557 DataNode
1878 Jps

可以看到各节点上新增的 YARN 相关进程:

  • ResourceManager:运行在主节点 server1 上,负责整个集群的资源管理和调度

  • NodeManager:运行在所有从节点(server2 和 server3)上,负责单个节点上的资源管理和任务执行

在线扩容

在 Hadoop 集群运行过程中,随着业务增长,可能需要动态增加新的计算和存储节点。Hadoop 支持在线扩容,允许在不停止现有服务的情况下,将新节点加入集群。本节演示如何向已运行的完全分布式集群中添加第四个节点(server4)。

1. 新节点环境准备

在新节点 server4 上执行以下操作,确保其环境与集群其他节点一致:

# 安装 NFS 客户端工具
[root@server4 ~]# yum install -y nfs-utils
创建 hadoop 用户(需与集群其他节点保持相同 UID/GID)
[root@server4 ~]# useradd hadoop
设置 hadoop 用户密码(可选,用于 SSH 登录)
[root@server4 ~]# echo 001003 | passwd --stdin hadoop
挂载主节点共享的 Hadoop 安装目录
[root@server4 ~]# mount 192.168.223.181:/home/hadoop/ /home/hadoop/
切换到 hadoop 用户并验证挂载
[root@server4 ~]# su - hadoop
[hadoop@server4 ~]$ ls
hadoop  hadoop-3.3.6  hadoop-3.3.6.tar.gz  jdk  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz

2. 配置文件调整

在主节点 server1 上,将新节点 server4 添加到 workers 配置文件中:

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim workers
# 在文件中添加 server4
server2
server3
server4

注意:修改 workers 文件后,无需重启集群,HDFS 和 YARN 会自动识别新节点。

3. 启动新节点服务

在新节点 server4 上,分别启动 HDFS DataNode 和 YARN NodeManager 服务:

# 启动 HDFS DataNode 服务
[hadoop@server4 hadoop]$ bin/hdfs --daemon start datanode
启动 YARN NodeManager 服务
[hadoop@server4 hadoop]$ bin/yarn --daemon start nodemanager
验证服务进程
[hadoop@server4 hadoop]$ jps
1540 DataNode
1604 NodeManager
1654 Jps

4. 验证扩容成功

扩容完成后,可以通过以下方式验证新节点已成功加入集群:

  • HDFS Web 界面:访问 http://server1:9870,在 "Datanodes" 页面查看是否出现 server4 节点。

  • YARN Web 界面:访问 http://server1:8088,在 "Nodes" 页面查看 NodeManager 节点列表。

  • 命令行验证:在主节点执行 hdfs dfsadmin -report 查看 DataNode 状态。

总结:Hadoop 集群的在线扩容功能使得集群扩展变得灵活且无需停机。通过 NFS 共享软件目录、修改 workers 配置文件并启动新节点服务,即可将新节点无缝集成到现有集群中,实现存储和计算能力的线性扩展。

更多推荐