Ubuntu 三台虚拟机 Hadoop 集群安装和搭建(全面详细的过程)
1.资源准备
ubuntu-24.04.3-live-server-amd64.iso:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/24.04/ubuntu-24.04.3-live-server-amd64.iso
hadoop3.4.3: https://dlcdn.apache.org/hadoop/common/hadoop-3.4.3/hadoop-3.4.3.tar.gz
mobaxterm:https://mobaxterm.mobatek.net/download.html
2.ubantu安装
新建虚拟机:

选择下载的ubantu iso

修改名字,位置最好不要放在c盘

设置磁盘40G,内存6G,2个处理器每个处理器2个内核



后面一直按照默认的Done就行了



等待安装这个过程可能要半个小时到1个小时左右
上方出现提示Installation complete!
然后选择Reboot Now

3.准备工作
输入hadoop用户,再输入之前设置的密码登录

为后续操作方便,这里对hadoop用户添加管理员的权限
sudo adduser hadoop sudo
这里我们先对电脑上的软件更新一下,避免后续软件安装时因为软件没有更新而失败
sudo apt-get update
4.hadoop 中的集群单点模式需要使用到SSH登录,Ubuntu默认参数了SSH client,我们需要再安装SSH Server
sudo apt-get install openssh-server
我们使用SSH登录远程服务器
ssh localhost
这里需要输入yes
因为每次需要输入密码,同时hadoop启动需要免密,我们须配置成无密码登录
首先退出ssh,回到终端窗口
exit
进入到ssh目录中
cd ~/.ssh/
然后利用ssh-keygen生成密钥
ssh-keygen -t rsa
会有提示,都按回车就可以
然后将密钥加入到授权中,此时再使用ssh localhost命令就无需登录密码了
cat ./id_rsa.pub >> ./authorized_keys
5.环境配置安装
| 项目 | Value |
|---|---|
| linux | ubuntu24.04.3 |
| java | JDK11 |
| hadoop | 3.4.3 |
| vmware workstation | 17.6.0 |
查询ip并用MobaXterm连接虚拟机
为了方便后续的操作,我们使用MobaXterm来连接虚拟机
查询虚拟机ip
ip addr show
形如下面所示:
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 192.168.131.131/24 brd 192.168.131.255 scope global ens33
这个虚拟机的ip就是192.168.131.131
打开MobaXterm填入信息,端口号不用改默认就是22,然后输入你的密码即可连接

安装JDK
sudo apt-get install openjdk-11-jdk
查看java版本:
java -version
然后配置java环境
vim ~/.bashrc
在文件最前面添加
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
激活环境后,查看java版本
source /etc/profile # 激活环境
查看设置的环境变量是否生效
echo $JAVA_HOME
输出示例:
/usr/lib/jvm/java-11-openjdk-amd64
查看是否是自己安装的java路径和版本
java -version
whereis java
java 安装完成。
安装Hadoop
创建Downloads目录
mkdir ~/Downloads
将文件导入这个目录即/home/hadoop/Downloads
进入这个目录后,点击upload即绿色向上的箭头上传下载的文件hadoop

上传后解压到自定义文件夹:
sudo tar -zxf ~/Downloads/hadoop-3.4.3.tar.gz -C /usr/local/
检查是否安装好:
cd /usr/local/
ls

使用ls可以看到,现在的文件夹名为hadoop-3.4.3(根据下载版本),为了方便,我们将文件夹名称改为hadoop
sudo mv hadoop-3.4.3 hadoop
然后修改文件权限
sudo chown -R hadoop ./hadoop
可以来查看我们解压的hadoop是否可用
cd hadoop
/bin/hadoop version

为 hadoop 配置 java 环境,打开hadoop安装目录的 etc/hadoop/hadoop-env.sh 文件:
sudo vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
找到 JAVA_HOME,写入自己的路径:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
6.两台虚拟机设置
克隆两台虚拟机
打开vmware的library面板:
-
右键需要复制的虚拟机,选择
management -> clone -
一直下一步,等待完成

-
复制两台虚拟机 hadoop-worker1、hadoop-worker2

设置静态IP
三台虚拟机之间通过ip通信,所以要固定三台机器静态ip,以便相互访问。
-
查看虚拟机的虚拟网卡,查看NAT模式配置(点击vm上方菜单 编辑-虚拟网络编辑器)
选择NAT再点击NAT设置


打开网卡配置文件:
sudo vim etc/netplan/01-netcfg.yaml
打开会显示是新文件,这个是正常现象
自定义设置 addresses 和 routes:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
# 根据自己的IP地址更改下边的IP即可
- 192.168.131.131/24
routes:
- to: default
# 网关,上一步记录的Gateway IP
via: 192.168.131.2
nameservers:
# 域名解析器
addresses: [192.168.131.2, 8.8.8.8]
给这个文件授权
sudo chmod 600 /etc/netplan/01-netcfg.yaml
给原本的文件改名防止干扰
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak
保存重启网络服务:
sudo netplan apply
查看ip保证只有一个ip地址
ip addr show
其余两台虚拟机也设置好静态ip,并将三个ip记录。
重复上面的操作记得修改ip地址
修改虚拟机host
修改 hostname 和 hosts 便于通信:
sudo gedit /etc/hostname
将三台虚拟机 hostname 分别设置为master、slave1、slave2。
# 在 Master 上
sudo hostnamectl set-hostname master
# 在 Worker1 上
sudo hostnamectl set-hostname slave1
# 在 Worker2 上
sudo hostnamectl set-hostname slave2
在后面添加各自设置的静态ip:
上面部分替换即可
127.0.0.1 localhost
192.168.131.131 master
192.168.131.132 slave1
192.168.131.133 slave2
下面ipv6内容不用调整保留原样
分别在三台虚拟机测试能否ping通:
ping master
ping slave1
ping slave2
ssh免密登录
为三台机器添加ssh密钥,实现远程无密码访问:
sudo ufw disable # 关闭防火墙
在节点master生成SSH公钥,并分发给其他机器:
ssh localhost
cd ~/.ssh
rm ./id_rsa*
ssh-keygen -t rsa
生成密钥后,分发给节点(根据提示输入虚拟机密码):
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
scp ~/.ssh/authorized_keys slave1:~/.ssh/
scp ~/.ssh/authorized_keys slave2:~/.ssh/
以上步骤在master节点实现即可
测试是否分发成功(注意:任意两台机器之间须免密访问)
ssh slave1
如果不提示输入密码直接进去了,说明成功!输入
exit退出,继续测试slave2:注意:每台机器均需配置,任意两台机器之间须免密访问。
ssh slave2
同样不输密码直接进去,才算成功。
ssh master
关闭防火墙
systemctl stop firewalld.service
7.Hadoop配置
打开hadoop安装目录,进入 /etc/hadoop 路径,找到配置文件,并按照如下配置:
| hadoop-master | hadoop-worker1 | hadoop-worker2 | |
|---|---|---|---|
| HDFS | DataNode、NameNode | DataNode | SecondaryNameNode、DataNode |
| YARN | NodeManager | NodeManager、ResourceManager | NodeManager |
从这里开始一直到将整个 Hadoop 配置分发到从节点都只在master节点上实现
创建 Hadoop 数据存储目录(Master 节点)
修改core-site.xml
vim /usr/local/hadoop/etc/hadoop/core-site.xml
找到原有的
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<!-- 指定 Hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data</value>
</property>
<!-- 指定 Hadoop 客户端操作用户 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
修改hdfs-site.xml
vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
填入以下内容:
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>master:9870</value>
</property>
<!-- 2nn web 端访问地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:9868</value>
</property>
</configuration>
修改yarn-site.xml、
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
填入以下内容(注意 ResourceManager 在 slave1):
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1</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_MAPRED_HOME</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://master:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
修改mapred-site.xml
vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
修改为以下内容
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定 mapreduce 运行环境 -->
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
</configuration>
修改workers
vim /usr/local/hadoop/etc/hadoop/workers
清空并填入以下内容:
master
slave1
slave2
修改hadoop-env.sh
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
在文件末尾(或合适位置)添加以下 5 行(可以顺便检查一下Java环境):
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
将整个 Hadoop 配置分发到从节点
必须在 master 节点上执行。如果不做这一步,slave1 和 slave2 会找不到配置。
(slave1和slave2要开机才能传输)
scp -r /usr/local/hadoop/etc/hadoop/ slave1:/usr/local/hadoop/etc/
scp -r /usr/local/hadoop/etc/hadoop/ slave2:/usr/local/hadoop/etc/
测试
在分发完配置后,你可以登录 slave1 和 slave2 验证一下文件是否同步成功:
在 slave1 和slave2上执行:
cat /usr/local/hadoop/etc/hadoop/workers
应该输出三行:master、slave1、slave2。
在 slave1 和slave2 上执行:
cat /usr/local/hadoop/etc/hadoop/core-site.xml
应该能看到 fs.defaultFS 的值是 hdfs://master:8020。
格式化 NameNode (只在 Master 上执行一次)
/usr/local/hadoop/bin/hdfs namenode -format
成功标志: 看到类似 Successfully formatted 或 Storage directory ... has been successfully formatted 的字样。
启动集群
这会自动启动所有节点的 HDFS 相关进程(NameNode, DataNode, SecondaryNameNode)。
在Master 上启动dfs:
/usr/local/hadoop/sbin/start-dfs.sh
在slave1上启动yarn。
/usr/local/hadoop/sbin/start-yarn.sh
分别在三台机器输入查看hadoop进程:
jps
- master:NameNode、DataNode、NodeManager

- slave1:DataNode、ResourceManager、NodeManager

- slave2:SecondaryNameNode、DataNode、NodeManager

配置完成。