如何在 VMware 中安装 Hadoop

本教程是在 VMware 的环境下搭建 Hadoop 集群,如果不使用 VMware ,可以跳过 VMware 部分。

本教程更新时间为:2023 年 3 月 20 日,在此之后官方版本更新,请酌情参考。

版本

  • VMware: 17.0.1
  • JDK: Adoptium 8
  • Hadoop: 3.3.4

VMware

优点

  • vmware 是行业领先的多云服务提供商,提供面向各式应用的多云服务,助力企业级控制力的同时实现数字创新。
  • vmware 支持许多 Linux 发行版直接安装虚拟机添加件,稳定,随意升级。
  • vmware 可以选择单个文件存储虚拟机,方便管理和迁移。

缺点

  • 硬件资源利用率较低,性能损失较大。
  • 对软件支持较差,可能出现兼容性问题。
  • 硬盘读写速度较慢。

下载安装包

image-20230313013819765

可从官网下载一个 VMware 安装包,或者从共享资料中下载安装包。

image-20230313013559275

双击安装包进行安装

image-20230313013928992

点击【更改】,将安装位置修改到 C 盘之外的位置,以及关闭【将 VMware Workstation 控制台工具添加到系统 PATH】这一选项,我们之后的操作并不需要此功能。

image-20230313014115065

这是修改后的界面,然后点击【下一步】,继续进行安装。

image-20230313014140614

选择在桌面和开始菜单添加快捷方式,之后进行操作,然后点击【下一步】,【安装】。

image-20230313014308576

安装完毕后,点击【许可证】进行激活即可。

image-20230313014347103

最后呈现这样的画面即可安装完成。

配置网络

在真正安装 Ubuntu 虚拟机之前,以便之后更方便的搭建集群,我们需要先配置好一个虚拟网络,方便之后数据交互。

image-20230313014502244

首先我们双击单开 VMware 的快捷方式,运行软件。

image-20230313014606888

选择左上角的【编辑】-【虚拟网络编辑器】,添加自定义网络。

image-20230313015301511

选择右下角的【更改设置】,进行管理员授权后才能进行修改。

image-20230313015355795

点击【添加网路】按钮,添加一个新的网络。

image-20230313015437454

随意选择一个网络名字,我这里选择 VMnet0,然后点击【确定】。

image-20230313015553925

选择新添加的 VMnet0 网络,将模式调整为 NAT 模式,我这里不选择【将主机虚拟适配器连接至此网络】,因为这次搭建的分布式 Hadoop,不用将 PC 主机作为一个节点。

选择上【使用本地 DHCP 服务将 IP 地址分配至虚拟机】。

子网 IP 输入:192.168.20.0,输入其他地址也可以,但需保证最后一位为 0

点击【DHCP 设置】按钮。

image-20230313015922304

将起始 IP 地址设置为:192.168.20.101,结束 IP 地址设置为:192.168.20.200,让后续创建的虚拟机能够在此范围内自动分配一个 IP,然后点击【确定】。

然后点击确定,应用此虚拟网络。

Ubuntu

接下来我们就需要使用 VMware 搭建 Hadoop 集群,首先我们需要准备一个 Ubuntu 镜像,配置好 Ubuntu,通过克隆的方式创建多个虚拟机,再在此基础上搭建 Hadoop 集群。

下载镜像

首先我们需要准备一个 ubuntu,作为 master 节点,首先我们访问 Ubuntu 官网下载桌面镜像:下载 Ubuntu 桌面系统 | Ubuntu

image-20230313020544155

选择 LTS 版本的 Ubuntu 系统进行下载。

image-20230313020638763

下载完毕后,是个 iso 后缀的镜像文件。

创建虚拟机

我们首先来创建集群中的第一个节点,主节点 (master)。

image-20230313020808002

在 VMware 中,点击【创建新的虚拟机】,选择【典型】模式,点击【下一步】。

image-20230313020924844

为了模拟真实的安装环境以便之后真实上机操作,我们选择【稍后安装操作系统】,点击【下一步】。

image-20230313021028134

选择客户机操作系统为【Linux】,版本为【Ubuntu 64 位】,点击下一步。

image-20230313021225526

输入虚拟机名称,我这里为了方便记忆选择输入【主节点 01】,选择保存位置,尽量不要保存至 C 盘,避免以后空间不足,点击【下一步】。

image-20230313021324194

接下来输入虚拟机占用空间,20G 时完全足够了,如果空间不足可以适当减少,点击【下一步】。

image-20230313021417758

点击【自定义硬件】,修改网络和插入光盘。

image-20230313021711925

首先选择【新 CD/DVD】,通过浏览的方式,将刚才下载的 Ubuntu 镜像使用。

image-20230313021743835

然后选择【网络适配器】,将【网络连接】选择为自定义中我们刚才创建的【VMnet0】网络,点击【关闭】,点击【完成】。

启动虚拟机

image-20230313022002133

点击绿色播放键可启动按钮,也可以通过菜单栏的下拉按钮,启动 / 关闭 / 挂起 / 重启虚拟机。

安装 Ubuntu

启动虚拟机后,会自动读取虚拟 DVD 中的 Ubuntu 镜像安装虚拟机。

image-20230313022220826

点击屏幕中央,让虚拟机捕获鼠标指针,使用【回车】,选择【Try or Install Ubuntu】。

image-20230313022427611

通过左侧列表,选择【中文(简体)】选择语言方便操作,然后点击【安装 Ubuntu】。

image-20230313022536523

键盘布局选择【English(US)】-【English(US)】,点击【继续】。

image-20230313022647903

点击【最小安装】,取消选择【安装 Ubuntu 时下载更新】,点击继续【继续】。

image-20230313022758601

因为我们实在一个空白的虚拟机上安装,所以我们选择【秦楚整个磁盘并安装 Ubuntu】,点击【现在安装】。

image-20230313022929442

为了方便之后的免密登录,我们统一使用 hadoop 账户名,使用其他名字,或者使用 root(不推荐)也可以,点击【继续】。

image-20230313023056797

因为我们没有选择下载时更新,所以我们不会下载特别多的文件,稍等片刻即可。

image-20230313023651024

安装完毕后,呈现这个画面,点击【我已完成安装】,【现在重启】。

image-20230313023733641

出现这个页面,是因为没有移除镜像,将虚拟机进行关机。

image-20230313024014197

点击【编辑虚拟机设置】,选择【新 CD/DVD】,选择【使用物理驱动器】或者将虚拟机光驱移除都可以,点击【确定】关闭窗口,点击【开启此虚拟机】开始配置 Ubuntu。

配置 Ubuntu

修改分辨率

image-20230313024424621

通过【设置】-【显示器】,可调整桌面显示大小,更方便查看内容。

换源

image-20230313024610571

可通过【菜单】-【软件更新器】,进行软件更新。

image-20230313024729784

点击软件更新器的【设置】-【Ubuntu 软件】-【下载自】,进行换源。

image-20230313024822853

可点击【其他】,通过【选择最佳服务器】测速测速延迟最低的服务器,确认经过【重新载入】后,以后就可以从国内下载软件包了。

命令行换源 (可选)

使用 sudo gedit /etc/apt/sources.list,使用编辑器进行换源,具体内容可参考:ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,纯命令行模式可使用 vimnano 进行命令行编辑,此情况仅用于服务器的情况下,个人使用可使用可视化的编辑器编辑文件 或 使用可视化的软件更新器,使用 UI 来选择源。

更新系统

image-20230320225940249

换源后,使用软件更新器,或者使用命令 sudo apt dist-upgrade 可用于更新系统软件

管理员密码

使用 Ctrl+Alt+T 打开终端,可以先使用 sudo passwd root,给 root 账户设置一个权限密码。

管理语言

image-20230313025617475

如果安装系统时没有自动配置中文,可使用【设置】-【区域与语言】-【管理已安装的语言】,将汉语作为系统语言应用。

VMware Tools

使用下面的命令安装 VMware Tools 工具,支持主机之间复制粘贴,以及小文件拖拽。

1
2
3
sudo apt-get autoremove open-vm-tools
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop

克隆子节点

将主节点虚拟机关闭。

image-20230313025820957

主节点右键,选择【管理】-【克隆】。

image-20230313025900684

使用【创建完美克隆】的方式,再创建 2 个子节点。

Hostname

hostname 是主机名,用于在系统中标识一台机器。

image-20230313030403815

在网络通信中,可以用来识别某个设备。可以通过 hostname 命令来查看或设置 Linux 系统的 hostname,也可以通过:~$ 前的字符查看 hostname。

因为我们是克隆出来的 2 个子节点,并不是手动创建的,3 个节点的主机名都一致,我们需要手动修改。

image-20230313032659952

使用以下命令更新子节点 1 的主机名:

1
sudo gedit /etc/hostname

然后 Ctrl+S 保存退出,使用 reboot 命令重启虚拟机。

image-20230313032725082

即可看到主机名修改成功,子节点 2 通过同样的方式修改为 slave2

Hosts

Hosts 是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联 “数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从 Hosts 文件中寻找对应的 IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。

为了机器能够快速识别自己以及其他机器,我们可以做一下域名和 IP 的 hosts 映射,这样在之后的操作中,我们就可以直接用域名来代替 IP 地址。

image-20230313031525126

通过【设置】-【网路】-【详情】的方式查看每一台机器为:

主机名 IP 地址
master 192.168.20.101
slave1 192.168.20.102
slave2 192.168.20.103

或者使用命令 ifconfig 查看每一台机器的 IP,并依次记录下来。

使用命令 sudo gedit /etc/hosts,将以下信息编辑进去,方便互相通信

1
2
3
192.168.20.101  master
192.168.20.102 slave1
192.168.20.103 slave2

image-20230313033950192

为了防止之后重启,超过 DHCP 网络租用时间,导致 IP 变动,可将当前 IP 设置为手动,可让虚拟机一直使用对应的 IP。

然后再每一个节点上都进行以上的操作。

SSH

简介

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

安装 SSH

本次安装虚拟机是最小安装 Ubuntu,没有安装 SSH。

image-20230313034034538

可使用下面的命令安装 SSH 的客户端和服务器端,当出现如图所示的情况,则表示安装成功。

1
sudo apt install openssh-client openssh-server

安装异常

如果 ssh 已安装,但无法正常使用,可使用以下的命令,卸载 ssh 及配置文件,并重新进行安装

1
2
sudo apt purge openssh-client openssh-server
sudo apt install openssh-client openssh-server

生成密钥对

image-20230313033103476

使用下面的命令,生成密钥对,一直回车,当出现如图,表示生成成功。

1
ssh-keygen -t rsa

该命令将在 /home/hadoop/.ssh 目录下面产生一个密钥 id_rsa 和一个公钥 id_rsa.pub

将你的计算机 (B) 中的公钥传给别的计算机 (A),A 计算机才能免密码登录计算机 B

免密登录本机

1
cp /home/hadoop/.ssh/id_rsa.pub /home/hadoop/.ssh/authorized_keys

使用以上命令将 ssh 生成的公钥复制为授权的密钥,即可完成自己免密登录本机。

检查 SSH 文件

1
2
cd /home/hadoop/.ssh/
ls -l

使用上面的命令,切换到用户的.ssh 查看 ssh 配置文件及权限

image-20230313033155426

如上图所示的文件名和权限,则操作正确。

1
ssh localhost

然后使用上面的命令,免密连接本机,测试是否成功。

image-20230313034132251

第一次登录需要进行一次验证,输入 yes 即可,当出现上图的提示,表示免登录成功。

然后可通过 exit,退出登录,退出 ssh 登录本机的状态。

修复权限

如果权限不正确,请使用下面的命令修改权限

1
chmod 644 authorized_keys

集群免密登录

接下来在每一台节点上,重复运行命令 ssh-keygen -t rsa,生成密钥对

使用命令 cat /home/hadoop/.ssh/id_rsa.pub,查看公钥

image-20230313034719486

image-20230313034817798

将内容复制到主机 master 节点上的 /home/hadoop/.ssh/authorized_keys 文件中,复制成功后,可通过命令 cat /home/hadoop/.ssh/authorized_keys, 查看所有节点的公钥,应如下图所示

image-20230313034938353

然后使用下面的命令,将 authorized_keys 文件传给,其他节点的相同位置,这次传输,因为还没有免密成功,所以还是需要输入密码

1
2
scp /home/hadoop/.ssh/authorized_keys slave1:/home/hadoop/.ssh/
scp /home/hadoop/.ssh/authorized_keys slave2:/home/hadoop/.ssh/

这样子,我们就让每一台机器都持有了集群中所有节点的公钥,任意机器都可以通过 ssh 登录到任意节点

image-20200904155342071

可以使用 ssh 尝试登录别的节点,正常情况下,不会出现提示,直接登录

image-20200904155425643

JDK

https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions

  • Apache Hadoop 3.3 and upper supports Java 8 and Java 11 (runtime only)

  • Please compile Hadoop with Java 8. Compiling Hadoop with Java 11 is not supported: imgHADOOP-16795 - Java 11 compile support OPEN

  • Apache Hadoop from 3.0 to 3.2 now supports only Java 8

  • Apache Hadoop from 2.7.x to 2.x support Java 7 and 8

所以我们选择 JDK 8

下载

首先打开 JDK 的下载页面:Latest Releases | Adoptium

image-20230320112924339

选择 Linux 版本 8 版本的 JDK 下载即可

解压

image-20230320113029444

将 JDK 的压缩包上传至用户主路径下(/home/haddop),使用系统自带的归档管理器,打开压缩包,将 jdk 文件夹提取出来。

image-20230320113720749

解压路径和目录结构如图所示。

环境变量

为了方便使用 JDK,需要配置环境变量,使用命令 gedit /home/hadoop/.bashrc 编辑用户环境变量文件,将下面的文本添加进环境变量

1
2
3
# JAVA
export JAVA_HOME=/home/hadoop/jdk8u362-b09
export PATH=${JAVA_HOME}/bin:$PATH

运行命令 source /home/hadoop/.bashrc,更新用户变量。

image-20230320113959438

然后运行命令 java -version,查看 JDK 是否安装成功。

同步到其他节点

使用以下命令同步到其他节点

1
2
3
4
scp -r /home/hadoop/jdk8u362-b09 slave1:/home/hadoop/
scp /home/hadoop/.bashrc slave1:/home/hadoop/
scp -r /home/hadoop/jdk8u362-b09 slave2:/home/hadoop/
scp /home/hadoop/.bashrc slave2:/home/hadoop/

使用命令 source /home/hadoop/.bashrc 更新各个节点的环境变量,或者直接重启节点即可。

Hadoop

下载

首先点击这里,进入 Hadoop 官网下载页面。

image-20230320120100769

选择 3.3.4 (stable) 稳定版本进行下载,然后点击 binary 地址进行下载

image-20230320120117767

选中官方推荐的地址即可下载,其他地址也可用(建议采用迅雷等下载工具下载,速度比较会快很多,上传至 UBUNTU 系统)

解压

image-20230320120329583

将 Hadoop 的压缩包上传至用户主路径下(/home/haddop),使用系统自带的归档管理器,打开压缩包,将 hadoop-3.3.4 文件夹提取出来。

image-20230320120408496

解压路径和目录结构如图所示。

环境变量

使用命令 gedit /home/hadoop/.bashrc 编辑用户环境变量文件,将下面的文本添加进环境变量

1
2
3
# HADOOP
export HADOOP_HOME=/home/hadoop/hadoop-3.3.4
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

运行命令 source /home/hadoop/.bashrc,更新用户变量。

配置

hadoop 的部署分为 3 种模式,分别为单机模式 伪分布模式 (单节点) 全分布模式三种

无论部署哪种模式,我们都需要先配置环境变量,我们选择配置系统变量,无论是否是当前路径都可以使用

首先打开 /home/hadoop/hadoop-3.3.4/etc/hadoop 这个目录,分别编辑下面几个文件,根据个人需求更改参数:

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
# 配置hdfs的namenode的地址,使用的是hdfs协议
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
# 配置hadoop运行时产生数据的存储目录,不是临时目录
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-3.3.4/tmp</value>
</property>
</configuration>

master 在 hosts 文件中做了映射,可以替换成本机 IP

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
# 配置在hdfs中,一份文件存几份,默认是3份,一台机器只能存一份,小于datanode数量
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
# 是否打开权限检查系统
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
# 命名空间和事务在本地文件系统永久存储的路径
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadoop-3.3.4/data/namenode</value>
</property>
# DataNode在本地文件系统中存放块的路径
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadoop-3.3.4/data/datanode</value>
</property>
</configuration>

如果你只有 3 个 datanode,但是你却指定副本数为 4,是不会生效的,因为每个 datanode 上只能存放一个副本。

hadoop 有时候并不能自己创建 namenode 和 datanode 文件夹,可以运行下面的命令手动创建这 3 个文件夹

1
2
3
mkdir -p /home/hadoop/hadoop-3.3.4/data/namenode
mkdir -p /home/hadoop/hadoop-3.3.4/data/datanode
mkdir -p /home/hadoop/hadoop-3.3.4/tmp

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<configuration>
# 指定yarn的resourcemanager的地址(该地址是resourcemanager的主机地址,即主机名或该主机的ip地址)
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
# 用户可以跨平台提交应用程序
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
# 指定mapreduce执行shuffle时获取数据的方式
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<configuration>
# 指定mapreduce运行在yarn上
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
# 允许跨平台提交任务
<property>
<name>mapreduce.app-submission.cross-platform</name>
<value>true</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/hadoop-3.3.4</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/hadoop-3.3.4</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/home/hadoop/hadoop-3.3.4</value>
</property>
</configuration>

hadoop-env.sh

在任意地方添加 JAVA_HOME

1
export JAVA_HOME=/home/hadoop/jdk8u362-b09

workers

1
2
3
master
slave1
slave2

配置的是所有的从节点,用 IP 也可以,所有配置文件修改完毕后,进入 hadoop 初始化步骤

同步到其他节点

到此一个节点上的配置就已经全部配置完毕了

接下来,我们可以使用下面的命令,将 JDK 和 Hadoop 传输到其他节点

1
2
3
4
scp -r /home/hadoop/hadoop-3.3.4 slave1:/home/hadoop/
scp /home/hadoop/.bashrc slave1:/home/hadoop/
scp -r /home/hadoop/hadoop-3.3.4 slave2:/home/hadoop/
scp /home/hadoop/.bashrc slave2:/home/hadoop/

Hadoop 初始化

HDFS 初始化

集群模式下,需要对每一台机器进行初始化

接下来到各个节点运行下面的命令

1
hdfs namenode -format

格式化完毕后,如图所示,则表示初始化成功

image-20230320122754089

如果初始化失败,需要用下面的命令手动清空 namenode 和 datanode 文件夹,调整配置后,重新初始化

1
2
rm -rf /home/hadoop/hadoop-3.3.4/data/namenode/*
rm -rf /home/hadoop/hadoop-3.3.4/data/datanode/*

启动 Hadoop

Namenode

1
2
3
hdfs --daemon start namenode
hdfs --daemon stop namenode
hdfs --daemon restart namenode

Datanode

1
2
3
hdfs --daemon start datanode
hdfs --daemon stop datanode
hdfs --daemon restart datanode

你可以使用上面的命令挨个启动 namenode 和 datanode,如果已配置好 workers 和 ssh 免密登录,你可以使用下面的命令调用脚本直接启动所有 hdfs 进程

1
start-dfs.sh

ResourceManager

1
2
3
yarn --daemon start resourcemanager
yarn --daemon stop resourcemanager
yarn --daemon restart resourcemanager

NodeManager

1
2
3
yarn --daemon start nodemanager
yarn --daemon stop nodemanager
yarn --daemon restart nodemanager

你可以使用上面的命令挨个启动 resourcemanager 和 nodemanager,如果已配置好 workers 和 ssh 免密登录,你可以使用下面的命令调用脚本直接启动所有 yarn 进程

1
start-yarn.sh

启动成功

启动完毕后可以使用 jps 命令查看启动的 hadoop 进程

master 节点

1
2
3
4
5
6
28656 NodeManager
28388 ResourceManager
27284 SecondaryNameNode
26919 NameNode
27081 DataNode
28975 Jps

slave 节点

1
2
3
7666 DataNode
7784 NodeManager
7947 Jps

可以访问 http://master:9870 ,查看 HDFS 运行情况

image-20230320123412874

image-20230320123443099

可以访问 http://master:8088 查看所有 Yarn 任务的运行情况

image-20230320123526881

至此整个 hadoop 就搭建好了

案例测试

PI 值计算

我们可以使用一个简单的例子来测试一下 hadoop 是否能够正常运行

我们从 hadoop 安装文件夹,启动一个终端,使用下面的命令,计算 pi 值

1
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 10 10

如图所示,我们计算量比较少导致不够精确,但是已经可以成功运算出 pi 值了

image-20200904181452076

词频统计

1
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount hdfs://master:9000/input hdfs://master:9000/output

附件

相关链接