随着大数据时代的到来,Hadoop作为大数据处理的核心框架,其重要性不言而喻。Hadoop 3.0版本在性能、容错性和功能上都有显著提升。本文将详细介绍如何在Linux环境下搭建一个Hadoop 3.0完全分布式集群,并进行简单的测试。
一、 Linux系统的安装与配置
构建Hadoop集群的第一步是准备好集群所需的Linux环境。我们将使用虚拟机来模拟集群环境。
(一)准备工作
- 安装虚拟化软件
首先,需要安装一个虚拟化软件,例如 VMware Workstation。下载并安装VMware Workstation 工具。
- 新建虚拟机
打开VMware Workstation,选择“创建新的虚拟机”。
- 在向导界面选择“自定义(高级)”。
- 选择虚拟机硬件兼容性,一般选择最新的即可。
- 在安装客户机操作系统界面,选择“稍后安装操作系统”。
- 选择客户机操作系统为 Linux,并选择合适的版本(本例中安装的操作系统为OpenEuler22.03)。
- 命名虚拟机名称(例如 hadoop3-01),并设置虚拟机文件的保存位置。
- 在处理器配置界面,根据需要配置处理器数量和内核数量(例如处理器数量1,每个处理器内核数2)。
- 配置虚拟机内存大小,建议至少设置为 2GB (2048MB)。
- 在网络类型界面,选择“使用网络地址转换(NAT)”。
- 在选择 I/O 控制器类型界面,选择 LSI Logic。
- 在选择磁盘类型界面,选择 SCSI。
- 创建新的虚拟磁盘,设置磁盘大小(建议至少 20GB)。选择将虚拟磁盘存储为单个文件。
- 安装Linux操作系统
虚拟机创建完成后,需要安装Linux操作系统。
- 编辑虚拟机设置,在 CD/DVD 驱动器中选择“使用 ISO 镜像文件”,然后浏览到你的Linux系统安装镜像文件(本例中使用的操作系统镜像是:openEuler-22.03-x86_64-dvd.iso)。
- 启动虚拟机,按照安装向导进行安装。
- 在安装过程中,选择“自动分区”可以简化步骤。
- 设置 root 用户的密码。
- 等待安装完成,重启虚拟机。
成功登录虚拟机(例如 hadoop01)的效果如下图所示。在登录界面输入用户名 root,输入设置的密码(例如 Admin@!@#),按 Enter 键即可登录。
- 克隆虚拟机
为了快速搭建集群中的其他节点,我们可以克隆已经安装好基础系统的虚拟机 hadoop01。
- 完整克隆: 复制原虚拟机创建一个完全独立的新虚拟机,不和原虚拟机共享任何资源,可以脱离原虚拟机独立使用。
- 链接克隆: 需要和原虚拟机共享同一个虚拟磁盘文件,不能脱离原虚拟机独立运行。为了方便管理和节省磁盘空间,通常选择链接克隆。
右键点击虚拟机 hadoop01,选择“管理” -> “克隆”,按照向导完成克隆过程,创建 hadoop02 和 hadoop03 两台虚拟机。
- 配置虚拟机网络配置虚拟机的网络参数,将虚拟机 hadoop01、hadoop02 和 hadoop03 的网络由默认的动态 IP 修改为静态 IP。由于虚拟机网络连接使用的是 NAT 模式,其子网地址通常为 192.168.xxx.0,网关地址为 192.168.xxx.2 (具体根据你的VMware NAT设置)。
IP地址规划如下:
静态IP地址配置(以 hadoop01 为例):
编辑网卡配置文件:
Bash
修改以下内容(如果不存在则添加):
修改完成后,保存并退出。
执行以下命令重新启动网卡使配置生效:
Bash
测试到外网的连通性:
Bash
如果能ping通,说明网络配置成功。
配置主机名与IP地址的映射关系:
编辑 hosts 文件:
Bash
在文件中增加以下映射关系。这3台虚拟机上的 hosts 文件内容应相同。
保存并退出。
修改主机名:
在 hadoop01 上执行:
Bash
在 hadoop02 上执行:
Bash
在 hadoop03 上执行:
Bash
修改 DNS 配置:
编辑 resolv.conf 文件:
Bash
确保文件中包含有效的 DNS 服务器地址,例如:
- 配置免密登录
为了方便集群管理和操作,需要配置虚拟机之间的免密登录。在 hadoop1 上生成 SSH 密钥对:
Bash
过程中一直按回车键即可,无需设置密码。
查看生成的密钥文件:
Bash
会看到 id_rsa(私钥)和 id_rsa.pub(公钥)文件。
复制公钥文件到集群中所有相关联的虚拟机,实现 hadoop1 可以免密登录 hadoop1、hadoop2 和 hadoop3。
Bash
执行这些命令时,首次连接需要输入对应虚拟机 root 用户的密码。
测试免密登录:
在 hadoop1 中执行以下命令验证是否可以免密登录其他节点:
Bash
如果在 hadoop1 上执行 ssh hadoop1
也能免密登录自己,说明配置成功。
注意: 在 hadoop2 和 hadoop3 上也需要重复生成密钥对和复制公钥的步骤,以实现任意节点之间都可以免密登录(尽管对于Hadoop的启动和关闭,只需要主节点能免密登录其他节点即可)。为了完整性,建议在所有节点上都执行 ssh-copy-id hadoop1
, ssh-copy-id hadoop2
, ssh-copy-id hadoop3
。
二、 安装Hadoop
1、 Hadoop的集群部署模式
在安装 Hadoop 之前,先了解一下 Hadoop 的几种部署模式:
- 独立模式 (Standalone Mode): 在单台计算机的单个 JVM 进程中模拟 Hadoop 集群的工作模式。适用于快速安装体验 Hadoop 功能,不适用于生产环境。
- 伪分布模式 (Pseudo-Distributed Mode): 在单台计算机的不同 JVM 进程中运行 Hadoop 集群的守护进程。适用于开发环境进行测试和调试,不适用于生产环境。
- 完全分布模式 (Fully Distributed Mode): 在多台计算机的 JVM 进程中运行 Hadoop 集群的每个守护进程。这是实际生产环境的基础部署模式。
本文将重点介绍完全分布式模式的部署。
2、 在Linux中安装JDK(Java Development Kit)
Hadoop 是由 Java 编写的,因此需要安装 JDK。推荐安装 JDK 8 版本。
在 hadoop01 上创建用于存放软件、安装目录和数据的文件夹:
Bash
(1)上传 JDK 安装文件到 software 文件夹
使用 MobaXterm 或 WinSCP 等工具将 JDK 安装包(例如 jdk-8u371-linux-x64.tar.gz
)上传到 /export/software/
目录。 可以考虑在这里放一张使用 MobaXterm 或 WinSCP 上传文件的截图。
进入 software 目录,解压 JDK 的安装文件:
Bash
将解压后的 JDK 目录移动到 /export/server/
目录下。
在 hadoop02 和 hadoop03 上执行相同的操作,或者后续直接复制 /export/server/
目录。
(2)配置 JDK 的环境变量文件
编辑系统配置文件 /etc/profile
:
Bash
在文件的最末尾加入以下三行:
Bash
保存并退出。
使用 source
命令使配置文件的修改生效:
Bash
输入命令,测试 JDK 是否配置完成:
Bash
如果能显示 JDK 版本信息,说明配置成功。
(3)测试 Java 程序
使用 vi 编辑器编写一个简单的 Java 程序:
Bash
输入以下内容:
Java
保存,退出。
对 java 源程序进行编译:
Bash
编译成功后,在当前目录下会发现一个 .class
结尾的同名文件。
运行字节码文件:
Bash
如果出现“大家好,欢迎来到Java的世界!!!”的输出,说明程序运行成功。
2.3 Hadoop的安装
(1)下载 hadoop 安装包
可以通过访问 Hadoop 的官网( https://hadoop.apache.org/)下载其安装包。本文使用的是 Hadoop 版本为 3.3.0,安装包为 hadoop-3.3.0-aarch64.tar.gz
(请根据实际情况下载对应架构的版本,此处示例为 aarch64)。
(2)上传 hadoop 安装包到 software 目录,解压缩
将 Hadoop 安装包上传到 /export/software/
目录。
进入 software 目录,解压 hadoop 安装包:
Bash
将解压后的目录移到 /export/server
:
Bash
(3)配置 hadoop 的环境变量
编辑系统配置文件 /etc/profile
,在文件的最后添加以下配置:
Bash
保存退出,执行下面的命令,使修改的配置文件生效:
Bash
执行下面的命令,确认 hadoop 是否安装成功:
Bash
如果能显示 Hadoop 版本信息,说明安装成功。
复制安装文件和配置文件到其他节点:
为了方便后续配置,可以将 hadoop01 上已经安装好的 JDK 和 Hadoop 目录复制到 hadoop02 和 hadoop03。同时也要复制修改后的 /etc/hosts
和 /etc/profile
文件。
Bash
注意: 在 hadoop02 和 hadoop03 上执行 source /etc/profile
命令使配置文件生效。
(4) hadoop 配置文件的修改
Hadoop 集群的配置文件一般保存在 Hadoop 安装目录下的 etc/hadoop/
目录中,即 /export/server/hadoop-3.3.0/etc/hadoop/
。
- 修改 hadoop-env.sh
编辑hadoop-env.sh
文件,配置JAVA_HOME
和启动用户:
Bash
找到并修改或添加以下内容:
Bash
- 修改配置文件 core-site.xml
编辑core-site.xml
文件:
Bash
在 <configuration>
标签中增加以下内容:
XML
fs.defaultFS
指定了 NameNode 的地址和端口。hadoop.tmp.dir
指定了 Hadoop 临时文件的存放目录,建议放在数据盘。fs.trash.interval
配置了 HDFS 回收站的保留时间(单位:分钟)。
- 修改 hdfs-site.xml
编辑hdfs-site.xml
文件:
Bash
在 <configuration>
标签中增加以下内容:
XML
dfs.replication
指定了 HDFS 文件的副本数。dfs.namenode.secondary.http-address
指定了 Secondary NameNode 的地址和端口。
- 修改 mapred-site.xml 文件
使用系统提供的模板生成配置文件:
Bash
修改新生成的配置文件 mapred-site.xml
:
Bash
在 <configuration>
标签中增加以下内容:
设置 MapReduce 框架运行在 YARN 上。其他属性配置了 JobHistory Server 的地址和端口。
- 修改 yarn-site.xml 文件
编辑yarn-site.xml
文件:
Bash
在 <configuration>
标签中增加以下内容:
XML
yarn.resourcemanager.hostname
指定了 ResourceManager 运行的主机。其他属性配置了 NodeManager 的辅助服务、内存检查以及日志聚合等。
- 修改 workers 文件
编辑workers
文件,该文件指定了集群中作为 DataNode 和 NodeManager 的主机列表:
Bash
将文件的默认内容修改为以下内容:
每行一个主机名。这意味着 hadoop1、hadoop2 和 hadoop3 都将作为 DataNode 和 NodeManager。
(5)将集群主节点的配置文件分发到其他子节点
完成 hadoop01 的配置后,将修改后的配置文件分发到 hadoop02 和 hadoop03:
Bash
(请确保所有配置文件都已复制到其他节点)。
(6)启动 hadoop 集群
初次启动 HDFS 集群时,必须对 NameNode 进行格式化处理。 注意: 格式化 HDFS 文件系统的操作只在初次启动 Hadoop 集群之前进行,重复格式化会丢失 HDFS 中的数据。
在 hadoop01 上执行格式化文件系统指令:
Bash
看到 "successfully formatted" 等字样表示格式化成功。
(7)Hadoop 集群启动和关闭
针对 Hadoop 集群的启动,需要启动 HDFS 和 YARN 两个集群框架。
- 启动 HDFS 集群
在主节点 hadoop01 上执行指令start-dfs.sh
启动集群中所有节点的 HDFS 服务进程(NameNode, Secondary NameNode, DataNode):
Bash
可以使用 jps
命令查看各节点的 Java 进程,确认相关进程是否启动(NameNode, SecondaryNameNode, DataNode)。
- 启动 YARN 集群
在主节点 hadoop01 上执行指令start-yarn.sh
启动集群中所有节点的 YARN 服务进程(ResourceManager, NodeManager):
Bash
同样可以使用 jps
命令确认相关进程是否启动(ResourceManager, NodeManager)。ResourceManager 在 hadoop1 上,NodeManager 在 hadoop1, hadoop2, hadoop3 上。
可以通过Web界面查看集群状态:
- HDFS NameNode:
http://hadoop1:9870
- YARN ResourceManager:
http://hadoop1:8088
(请根据你的实际配置和防火墙设置确认端口是否可访问)
- 关闭 HDFS 集群
在主节点 hadoop01 上执行指令stop-dfs.sh
关闭 HDFS 服务进程:
Bash
- 关闭 YARN 集群
在主节点 hadoop01 上执行指令stop-yarn.sh
关闭 YARN 服务进程:
Bash
(8)Hadoop 集群的初体验 - 词频统计
使用一个简单的 MapReduce 示例程序来测试搭建好的 Hadoop 集群。
- 创建要统计词频的文本文件
在 hadoop01 上创建数据目录并创建文本文件word1.txt
:
Bash
在文件中输入一些文本内容,例如:
保存退出。
- 在 HDFS 上创建目录并上传文件
在 HDFS 上创建/wordcount/input
目录,并将本地文件/export/data/word1.txt
上传至该目录下:
Bash
[插入图:hdfs dfs -mkdir 命令执行截图]
Bash
[插入图:hdfs dfs -put 命令执行截图] 可以使用 HDFS 命令或通过 Web 界面查看文件是否成功上传。
使用 hdfs dfs -cat
命令查看 HDFS 上的文件内容:
Bash
- 运行 MapReduce 示例程序
Hadoop 提供了内置的示例程序,其中包括词频统计 (wordcount)。 进入 MapReduce 示例 jar 包所在的目录:
Bash
运行词频统计应用程序:
Bash
这个命令的含义是:使用 hadoop-mapreduce-examples-3.3.0.jar
中的 wordcount
程序,输入目录是 /wordcount/input
,输出目录是 /wordcount/output1
。
等待程序运行完成。
- 查看统计结果
词频统计的结果会保存在/wordcount/output1/
目录下。结果文件通常命名为part-r-xxxxx
。 使用hdfs dfs -cat
命令查看统计结果:
Bash
如果看到每个单词及其对应的词频,说明 Hadoop 集群正常工作,并成功运行了 MapReduce 程序。
补充知识:hadoop3.x 与 hadoop2.x 中常用端口的比较
Hadoop 3.x 相对于 Hadoop 2.x,一些默认端口发生了变化。了解这些变化有助于进行防火墙配置和访问 Web UI:
服务 | Hadoop 2.x 默认端口 | Hadoop 3.x 默认端口 |
NameNode (Web UI) | 50070 | 9870 |
ResourceManager (Web UI) | 8088 | 8088 |
JobHistory Server (Web UI) | 19888 | 19888 |
DataNode (Web UI) | 50075 | 9864 |
Secondary NameNode (Web UI) | 50090 | 9868 |
NameNode RPC | 8020 | 9000 |
DataNode 数据传输 | 50010 | 9866 |
DataNode 内部通信 | 50020 | 9867 |
在进行端口映射或防火墙配置时,请注意这些端口的变化。
总结
本文详细介绍了如何从零开始搭建一个 Hadoop 3.0 完全分布式集群,包括 Linux 环境准备、JDK 安装、Hadoop 安装配置以及一个简单的 MapReduce 示例。希望这篇博客能帮助您顺利搭建自己的 Hadoop 集群,并为后续的大数据学习和实践打下基础。在实际部署过程中,请根据您的具体环境和需求进行相应的调整。