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安装

新建虚拟机:

image-20260603111536767

选择下载的ubantu iso

image-20260603111551425

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

image-20260603111654889

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

image-20260603111712084

image-20260603111747816

image-20260603111833195

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

image-20260603112241327

image-20260603112326410

image-20260603112435817

等待安装这个过程可能要半个小时到1个小时左右

上方出现提示Installation complete!

然后选择Reboot Now

image-20260603143109574

3.准备工作

输入hadoop用户,再输入之前设置的密码登录

image-20260603143354766

为后续操作方便,这里对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
linuxubuntu24.04.3
javaJDK11
hadoop3.4.3
vmware workstation17.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,然后输入你的密码即可连接

image-20260603173346876

安装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

image-20260603151123739

上传后解压到自定义文件夹:

sudo tar -zxf ~/Downloads/hadoop-3.4.3.tar.gz  -C /usr/local/

检查是否安装好:

cd /usr/local/
ls

image-20260603151528632

使用ls可以看到,现在的文件夹名为hadoop-3.4.3(根据下载版本),为了方便,我们将文件夹名称改为hadoop

sudo mv hadoop-3.4.3 hadoop

然后修改文件权限

sudo chown -R hadoop ./hadoop

可以来查看我们解压的hadoop是否可用

cd hadoop
/bin/hadoop version

image-20260603151901940

为 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面板:

  1. 右键需要复制的虚拟机,选择 management -> clone

  2. 一直下一步,等待完成

    image-20260603172236331

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

    image-20260603171438449

设置静态IP

三台虚拟机之间通过ip通信,所以要固定三台机器静态ip,以便相互访问。

  1. 查看虚拟机的虚拟网卡,查看NAT模式配置(点击vm上方菜单 编辑-虚拟网络编辑器)

    选择NAT再点击NAT设置

    image-20260603173033432

    image-20260603173059377

打开网卡配置文件:

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-masterhadoop-worker1hadoop-worker2
HDFSDataNode、NameNodeDataNodeSecondaryNameNode、DataNode
YARNNodeManagerNodeManager、ResourceManagerNodeManager

从这里开始一直到将整个 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/

测试

在分发完配置后,你可以登录 slave1slave2 验证一下文件是否同步成功:

slave1slave2上执行:

cat /usr/local/hadoop/etc/hadoop/workers

应该输出三行:masterslave1slave2

slave1slave2 上执行:

cat /usr/local/hadoop/etc/hadoop/core-site.xml

应该能看到 fs.defaultFS 的值是 hdfs://master:8020

格式化 NameNode (只在 Master 上执行一次)

/usr/local/hadoop/bin/hdfs namenode -format

成功标志: 看到类似 Successfully formattedStorage 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

image-20260604154131407

  • slave1:DataNode、ResourceManager、NodeManager

image-20260604154153973

  • slave2:SecondaryNameNode、DataNode、NodeManager

image-20260604154218888

配置完成。


参考资料