跳转至

实验 1 - 搭建 Hadoop 环境

前置条件

项目 最低配置 推荐配置
存储 10 GB HDD 20 GB SSD
内存 8 GB DDR3 16 GB DDR4
处理器核心数 2 ≥ 4
处理器架构 Sandy Bridge / K10 Skylake / Zen / ARMv8
处理器指令集 无虚拟化扩展 VT-x / AMD-V / ARMv8 VMID

这些条件非硬性要求,在不满足若干个上述条件的情况下仍可继续完成本系列实验。

概述

本次实验的目的是得到一个搭建好且可以正常运行的 Hadoop 环境。我们的原则是:

  • 同时支持 Windows、macOS 和 Linux
  • 尽可能使用现代化,非过时的技术栈/软件版本
  • 尽可能按照行业最佳实践操作
  • 尽可能在配置层面1与原始 CentOS 版本保持一致

使用的软件:

  • 虚拟机工具
  • 操作系统:Ubuntu Server 22.04.5 LTS
  • Hadoop:Hadoop 3.3.6

注意!

不需要下载全部虚拟机工具,请根据你使用的系统选择。所有和主机操作系统有关的下载项前均有对应的图标。

刚买了 MacBook?

没关系,在 M 家族 Apple 芯片的 Mac 设备或其它 ARM 架构的设备上(如 Surface Pro X),此教程无法完全适用,但技术上运行 Hadoop 是完全可行的,可以尝试。况且 Hadoop 3.3.6 还增加了原生 ARMv8 支持呢。

有问题?

我们为你总结了一系列在本实验中可能遇到的常见问题,你可以在目录中找到。

下载需要的软件

虚拟化软件

曾经安装过虚拟化软件?

如果你已经安装并配置好了虚拟机软件,可以直接跳过这个小段的下载。

  • 如果你正在使用 Windows,你有多个选择2

    关于VMware Workstation Pro 激活

    2024年5月14日,博通宣布 VMware Workstation Pro 改为个人免费使用,并宣布 VMware Workstation Player 停产。 2024年11月13日,博通宣布 VMware Workstation Pro 改为全面免费使用,包括企业和个人用户。 所以请放心的使用吧!

  • 如果你正在使用 macOS,你有多个选择:

    • VMware Fusion Pro:
      • 官方地址
      • 如果你的 macOS 版本是 Monterey(12)或更新,并且已经安装了 Homebrew ,你可以使用以下命令来快速安装:
        brew install --cask vmware-fusion
        
    • VirtualBox:
      • 清华大学开源软件镜像
      • 如果你的 macOS 版本是 High Sierra(10.13)或更新,并且已经安装了 Homebrew ,你可以使用以下命令来快速安装:
        brew install --cask virtualbox
        
  • 如果你正在使用 Linux:

软件镜像

如果你是使用 M 家族 Apple 芯片的 Mac,Surface Pro X 等 ARM 设备

尝试以下组合:

配置虚拟机

创建虚拟机

跟随对应的虚拟机软件中的菜单,新建一个虚拟机,除非特别说明,否则均可以使用默认配置。

选择镜像

VMware 界面

选中下载的镜像后(文件名应为 ubuntu-22.04.5-live-server-amd64.iso),进行下一步。

VMware 用户提示

如果你使用 VMware 系列软件,在被提示到“使用简易安装”时,请务必关闭该功能(取消勾选)。简易安装主要适用于带图形界面的桌面版 Ubuntu 操作系统,在我们使用的服务器版 Ubuntu 中可能导致问题。

BIOS/UEFI 启动

使用 BIOS 启动

如果被问及是使用 BIOS 还是 UEFI 启动,请选择“传统 BIOS”

UEFI 是更加现代化的操作系统引导机制,由 Intel 提出,但同时 UEFI 也会引入更多复杂情况。为了保持流程简单,继续使用传统 BIOS 启动。

硬件配置

完成后,建议将硬件调整为以下配置:

项目 配置
CPU 2 核心
内存 2 GB / 2048 MiB
硬盘 20 GB,多文件3
网络 NAT

CPU 设置的细节

如果你使用的是 VMware Workstation Pro,请记得在设置处理器核心数量时,设置为处理器数量为 1每个处理器的内核数量为 2.

提高性能!

可以移除虚拟机默认添加的,不需要使用的硬件来部分减轻负载。以下设备可以安全移除:

  • 打印机
  • 摄像头
  • 声卡

推荐的配置如下图所示:

推荐配置 - VMware Workstation Pro

安装操作系统

语言设置

将虚拟机开机,等待启动完成,进入设置向导。

设置向导 - 语言选择界面

在这里直接选择默认的 English,按下回车键继续。在下一页中,保持默认键盘布局设置,回车继续。

为什么不用中文?

中文字符集相对复杂,依然建议使用字符集简单的英语为操作系统语言,否则容易出现 TTY 乱码或显示豆腐字(◻︎)问题。在 VESA VGA 模式下,默认色深只能显示 256 个字符。

真的,不是什么东西都能设置成中文的

识别键盘布局

正常情况下,在国内购买的键盘大多为美式键盘(ANSI)布局,偶见 ISO 布局键盘,这里我们可以直接按 Tab 选择 Done 跳过。

设置向导 - 选择键盘布局

选择安装类型

在 Ubuntu 22.04,Canonical 新增了“最小版本”服务器安装,我们不需要最小版本,以免缺少一些常用工具,保持默认选择 Ubuntu Server,选择 Done 继续。

设置向导 - 选择安装类型

网络设置

接下来迎接我们的就是网络设置页面。在 NAT 模式下,默认采用 DHCP 方式为虚拟机动态分配 IP 地址,我们需要让虚拟机主动“认领”属于自己的静态 IP 地址。

  • 记下 DHCP 服务为你分配的 IP 地址,这次我们将使用 192.168.178.123
  • 在你的设备上,这个第三段可能不是 178,你需要在接下来出现 178 的时候将其更换成符合你的情况的数字
  • 使用方向键选中 [ens33 eth - ▶︎],回车进入子菜单
  • 选择 Edit IPv4
  • 选择 Automatic (DHCP)
  • 选择 Manual
  • 填写所有字段,保持 IPv4 地址前三段不变:
    • Subnet: 192.168.178.0/24
    • Address: 192.168.178.100
    • Gateway: 192.168.178.2
    • Name servers: 192.168.178.2
    • Search domains 留空
  • 选择 Save 保存设置
  • 等待屏幕底部 Applying changes 动画消失后,选择 Done 完成网络配置

情况可能不一样

不同的设备上,VMware 自动选择的子网可能不一样。比如新的虚拟机可能拿到 192.168.114.51 这个地址,在此情况下,通常将上文中所有 178 都替换为 114 即可。接下来的步骤中,请记住这个小提醒,而不是盲目地复制形如 192.168.178.xxx 的 IP 地址。

网络配置

代理服务器配置

仔细看!

不要把镜像地址填写到代理服务器配置中,否则会导致后续 apt 无法联网。

此时我们来到了代理服务器配置,这在使用企业网络时通常有用,我们不需要,直接选择 Done 继续。

代理配置

镜像源配置

为什么不用 HTTPS?

是的,HTTPS 的确更安全,但绝大多数主流 Linux 发行版的包管理器都有一套自己的校验机制(通常是基于 GnuPG),保证软件包不被篡改。即使是 HTTP 连接也可以放心使用。HTTPS 连接有可能会因为 ca-certificates 包过老等原因失败,但 HTTP 不会。

接下来是镜像服务器配置,我们使用中国科学技术大学的开源软件镜像源,填入以下地址:

http://mirrors.ustc.edu.cn/ubuntu

镜像配置

硬盘格式化

接下来进入硬盘格式化页面(放心,格式化的是虚拟机的硬盘,不是主机硬盘),使用方向键移动到 [ ] Set up this disk as an LVM group 上,按回车键取消勾选,随后继续至下一页。

格式化硬盘 1

在这一页我们可以检查格式化配置,默认配置即可,回车继续。

格式化硬盘 2

系统会提示我们是否确定(因为存在先有数据在格式化过程中丢失的风险),直接选择 Continue 即可。

用户配置

在接下来的页面,配置默认管理员用户的信息,我们使用 super 作为管理员用户的用户名。当然,你也可以自定义一个属于你自己的用户。

用户配置

系统安装前的小插曲

恭喜!现在我们达到了正式的系统安装步骤,可以休——等等,你还要配置一些别的东西。

我们不需要 Ubuntu Pro 的功能,暂且跳过,选择 Skip for now.

跳过 Ubuntu Pro

在新的页面,选择 [ ] Install OpenSSH server,按回车键勾选,然后选择 Done.

OpenSSH 确认界面

Ubuntu Server 是一个热门的服务器操作系统,下一个页面会询问你是否需要一些主流环境,只可惜我们不需要。按下 Tab 键,选择 Done.

跳过热门 Snap 包

系统安装

现在,我们来到了系统安装界面,等待系统安装完成。

系统安装

完成!

可能不是那么的显眼,但安装过程通常较快,待底部菜单出现 [ Reboot Now ] 时,即可将其选中,确定重启,完成安装。

完成安装

卡住了?

如果你遇到满屏幕的 Failed unmounting /cdrom,没关系,检查虚拟机软件界面(VMware Workstation Player 的右下角,VMware Fusion Player 的标题栏)的光驱连接状态。

如果光驱尚未弹出,点击后,选择断开连接。如果光驱已经弹出,在虚拟机中按下回车即可。

弹出光驱

初来咋到!

咋回事?

TTY 的显示原理,可能出现 getty 启动后输出的提示信息被日志覆盖掉的情况,而此时 getty 已经在运行,等待用户登录。你也可以长按回车键,用刷屏的方式清空日志。

在重启后,如果长时间未出现新的日志项目,这个时候 getty 可能已经启动,可以登录了。按下回车键(可以多按几次),应该就会出现 namenode login: 的提示。如果没有,再重启一次。

登录界面

首次登录

输入之前设置的管理员用户名和密码,登录到系统。

登录完成

Hadoop 安装

终于!可以进入真正的重头戏了:Hadoop 的安装和配置。在此之后,我们需要克隆出两台相同的机器作为其他节点。

创建 Hadoop 用户

使用以下命令创建新用户:

sudo adduser hadoop
为什么不用 useradd

adduser 是 Debian 系 Linux 发行版的独有命令,而 useradd 可用于所有 Linux 发行版中,层级更低,不建议使用。如果你使用了其它发行版,没关系!可以使用以下命令创建用户:

sudo useradd -m hadoop

随后可以使用

sudo passwd hadoop

来修改 hadoop 用户的密码。

如果被提示到 super 或你创建的管理员用户的密码,输入并按下回车确认。

随后为 hadoop 用户设置密码,接下来提示设置全名等信息可以不填,直接回车跳过。最后被问及信息是否正确,直接按回车确定。

看清用户名!

在被问及输入密码时,一定要仔细确认“这是要输入谁的密码”,在 sudo 时需要输入的是执行 sudo 命令的用户的密码,并且会在提示中显示用户名。

虽然说对于母语为中文的我们来说,英语不是那么易读,但也不能完全不读。

添加用户

安装 Hadoop

  • 在虚拟机中,创建 Hadoop 安装目录:
    sudo mkdir /usr/local/hadoop
    
  • 在主机上:
    • 找到我们刚刚下载的 Hadoop 文件(hadoop-3.3.6.tar.gz)。
    • 打开:
      • 终端
      • 命令提示符(Windows 10)
      • :simple-windows11: Windows 终端(Windows 11)
    • 使用 cd 进入到所在文件夹,比如
      • cd ~/Downloads
      • cd %USERPROFILE%\Downloads
    • 使用该命令传输文件到虚拟机:
      scp hadoop-3.3.6.tar.gz super@192.168.178.100:/tmp
      

注意用户名!

如果你的虚拟机管理员用户名不是 super,你需要在这里将它替换为你的管理员用户名。

找不到 scp 或者 ssh 命令?

如果出现找不到命令的情况,请参考常见问题 scp 命令未找到

我们来偷懒:在虚拟机里,输入 exit 退出 hadoop 用户登录,再运行一次 exit 退出 super 用户登录,然后最小化/隐藏虚拟机软件界面。

在 getty 下,主机与虚拟机的剪贴板并不共享,也没有剪贴功能。这种情况下是无法使用复制粘贴功能的。但可以曲线救国:在主机的终端/命令提示符下,使用 ssh 连接到虚拟机:

ssh super/* (1)! */@192.168.178.100/* (2)! */
  1. 使用 super 用户登录
  2. 连接到 192.168.178.100

如果提示,输入 yes 信任虚拟机,输入密码登录,随后即可将内容粘贴至虚拟机中。

我们现在在虚拟机中,进行以下操作:

  • 将 Hadoop 压缩包移动至目的地
    sudo mv /tmp/hadoop-3.3.6.tar.gz /usr/local/hadoop
    
  • 前往 Hadoop 安装目录:
    cd /usr/local/hadoop
    
  • 解压缩:
    sudo tar -zxf hadoop-3.3.6.tar.gz
    
  • 调整位置:
    sudo mv hadoop-3.3.6/* .
    

仔细阅读!

以上命令的末尾有一个点(.),在输入的时候务必不要遗漏。

  • 移除目录:
    sudo rm -r hadoop-3.3.6
    
  • 移除压缩包:
    sudo rm hadoop-3.3.6.tar.gz
    
  • 修正权限:
    sudo chown -R hadoop:hadoop .
    

仔细阅读!

以上命令的末尾有一个点(.),在输入的时候务必不要遗漏。

  • 修改 profile
    sudo nano /etc/profile.d/hadoop.sh
    
  • 添加以下内容:
    hadoop.sh
    #HADOOP_HOME
    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin
    
  • 按下 Ctrl+X,确认保存(按 Y),确认文件名(回车 Enter
  • 应用变更:source /etc/profile

不是所有事情都是需要 sudo

Linux 有一个常见误区:无法完成想做的事情?加上 sudo 试试。在真正需要管理系统的权限时,应当使用 sudo 来提升权限,其他时候都不应该。反之,应当仔细检查其它可能的出错原因。sudo 的误用往往是一时解决了问题,但却会在后期带来更多的隐形的问题。同时任意 sudo 也有可能破坏系统安全,为系统带来安全隐患。在这一步,我们执行的基本都是系统管理命令,必须使用 sudo 才能正常完成。

安装 Java

为什么还在用 Java 8?

连 Minecraft 1.18 都需要 Java 19 或更高版本才能启动了。但至于 Hadoop,这是一个需要去问 Apache 的问题。Hadoop 目前仅有 Java 8 的完整支持,Java 11(2018 年发布)仍然处于“实验性”阶段。所以很抱歉,我们只能用 Java 8 了。

  • 安装 OpenJDK 包4
    sudo apt -y install openjdk-8-jdk
    
  • 修改 Hadoop 运行环境配置:
    sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    
  • Ctrl+W,输入 JAVA_HOME 寻找 JAVA_HOME 环境变量配置位置
  • 找到如下图位置,去除 # 来取消注释,填入:
    /usr/lib/jvm/java-1.8.0-openjdk-amd64
    
如果你使用 ARM 虚拟机

如果你使用 ARM 虚拟机,你需要填写 ARM64 JDK 的路径:

/usr/lib/jvm/java-1.8.0-openjdk-arm64
  • Ctrl+X 保存

Hadoop 环境配置

切换到 Hadoop 用户

使用以下命令切换到 hadoop 用户:

su - hadoop

输入 hadoop 用户的密码,完成登录。

  • 如果遇到 su: Authentication failure,则说明密码有误,需要重新尝试
  • 如果看到 hadoop@namenode:~$ 显示,则说明登录成功

此时可以执行 hadoop version 命令,如果显示 Hadoop 版本信息,则说明没有问题,可以继续。

Hadoop 配置

接下来我们执行 Hadoop 的配置。使用:

cd $HADOOP_HOME/etc/hadoop

命令,进入配置文件夹。

core-site.xml

执行 nano core-site.xml,在 <configuration> 块内填写以下信息(注释可以不添加):

core-site.xml
<configuration>
  <!-- Namenode address -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode:8020</value>
  </property>

  <!-- Hadoop data location -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/data</value>
  </property>

  <!-- Static user - no login needed -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>hadoop</value>
  </property>
</configuration>

core-site.xml

hdfs-site.xml

类似地,编辑 hdfs-site.xml,在 <configuration> 块内填写以下信息:

hdfs-site.xml
<configuration>
  <property><!-- (1)! -->
    <name>dfs.namenode.http-address</name>
    <value>namenode:9870</value>
  </property>
  <property><!-- (2)! -->
    <name>dfs.namenode.secondary.http-address</name>
    <value>datanode2:9868</value>
  </property>
</configuration>
  1. 主 Namenode 地址
  2. 第二 Namenode 地址

hdfs-site.xml

yarn-site.xml

yarn-site.xml
<configuration>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.resourcemanager<!-- (1)! -->.hostname</name><!-- (2)! -->
    <value>datanode1</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>
</configuration>
  1. 如果你正通过 Web VPN 访问此文档,复制时,请务必查看下方提示框内容
  2. 指定 YARN 在 datanode1 运行

如果你正在使用 Web VPN 访问此文档

学校使用的深信服 Web VPN 存在一个已知 bug,可能会将上方代码中的 yarn.resourcemanager.hostname 替换为 proxyLoc(yarn.resourcemanager).hostname,请务必参照下方截图确认你的配置无误

嗯,是的,其实我在编写的时候也被顺手坑了一把。

如果在启动 YARN 后发现只有 1 个活跃节点,大概率就是在这里被坑了。

yarn-site.xml

mapred-site.xml

mapred-site.xml
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

mapred-site.xml

workers

  • 修改 workers 文件:
    nano workers
    
  • 移除自带的 localhost
  • 填入以下内容:
    workers
    namenode
    datanode1
    datanode2
    
  • 保存

workers

配置网络

  • 退出 hadoop 用户:exit
  • 此时应当回退到了 super 用户,如果没有,重新登录
  • 修改 hosts
    sudo nano /etc/hosts
    
  • 修改 127.0.0.1 namenode192.168.178.100 namenode
  • 添加以下两行:
    /etc/hosts
    192.168.178.101 datanode1
    192.168.178.102 datanode2
    
  • 保存退出

hosts

克隆虚拟机

我们需要三台虚拟机作为真分布式 Hadoop 集群中的三台机器。我们以配置好的 namenode 为蓝本,创建另外两台机器。

克隆文件

  • 关机:
    poweroff
    
  • 在虚拟机软件中,右键 namenode,连续使用两次“创建链接克隆”5,保存为 datanode1 和 datanode2
    克隆虚拟机

如果你没有看到“克隆虚拟机”选项

这个功能只在 VMware Workstation Pro 中提供,VMware Workstation Player 无此功能。你可以切换到 VMware Workstation Pro 打开 namenode 虚拟机再执行克隆操作(二者格式互相兼容),也可以直接复制一份 namenode 虚拟机所在的文件夹,再双击打开新的文件夹内的 .vmx 文件。链接克隆的好处请参考附注5

配置克隆机网络

  • 开启 datanode1,如果提示是复制了还是移动了虚拟机,选择“我已复制该虚拟机”
    • 登录到 super 用户
    • 修改主机名:
      sudo hostnamectl set-hostname datanode1
      
    • 修改 IP 配置:
      sudo nano /etc/netplan/00-installer-config.yaml
      
    • addresses: 下的 192.168.178.100/24 替换为 192.168.178.101/24
    • 保存退出
    • 重启虚拟机:
      sudo reboot
      
    • 登录到 super 用户
    • 验证 IP 地址:ip addr
    • 出现 inet 192.168.178.101/24 即表示设置正确
  • 开启 datanode2,如果提示是复制了还是移动了虚拟机,选择“我已复制该虚拟机”
    • 登录到 super 用户
    • 修改主机名:
      sudo hostnamectl set-hostname datanode2
      
    • 修改 IP 配置:
      sudo nano /etc/netplan/00-installer-config.yaml
      
    • addresses: 下的 192.168.178.100/24 替换为 192.168.178.102/24
    • 保存退出
    • 重启虚拟机:
      sudo reboot
      
    • 登录到 super 用户
    • 验证 IP 地址:
      ip addr
      
    • 出现 inet 192.168.178.102/24 即表示设置正确

在三台机器上配置公钥登录

  • 在三台同时运行的虚拟机上,各自:
    • 切换到 hadoop 用户:
      su - hadoop
      
    • 生成公钥对:
      ssh-keygen -t ed25519
      
    • 按三次回车!(即全部使用默认配置)
  • 保证上述三个步骤已在三台机上全部执行完毕后,逐一完成公钥复制:
    • 在每台机器上运行这三个命令:
      ssh-copy-id namenode
      ssh-copy-id datanode1
      ssh-copy-id datanode2
      
    • 根据提示,如果询问是否信任主机,输入 yes
    • 如果询问 hadoop 用户密码,输入对应的密码
    • 在三台机器中的每一台机器上,均需执行上述所有三个命令

格式化 HDFS

在初次运行前,我们需要格式化 HDFS.

  • 在 namenode 机器上,使用 hadoop 用户身份
    • 格式化 HDFS:
      hdfs namenode -format
      

不要重复格式化!

请勿多次格式化 HDFS,否则会导致 cluster ID 不匹配,继而 datanode 无法启动。

启动集群

  • 在 namenode 机器上,使用 hadoop 用户身份
    • 启动集群:
      start-dfs.sh
      
  • datanode1 机器上,使用 hadoop 用户身份
    • 启动 YARN:
      start-yarn.sh
      

如果需要停止集群,只需要在 namenode 执行 stop-dfs.sh,在 datanode1 执行 stop-yarn.sh 即可。

谨慎使用 start-all.sh

由于 YARN 被配置在 datanode1 运行,只能在 datanode1 机器上执行 start-yarn.sh 来启动 YARN,否则会导致启动失败。即使 HDFS 可以访问,YARN 也会工作异常,无法为后续如实验五提供支持。

结束了?

恭喜你!Hadoop 的搭建工作就到此为止了。

可以在浏览器输入以下地址,访问对应的控制面板:

网页 地址
HDFS 控制面板 http://192.168.178.100:9870
YARN 控制面板 http://192.168.178.101:8088

可以输入 jps6 命令,查看正在运行的模块信息。

成功的标志

如果实验顺利完成,一共有以下几个成功标志:

启动和停止过程

启动过程应该输出类似:

hadoop@namenode: ~ $ start-dfs.sh
Starting namenodes on [namenode]
Starting datanodes
Starting secondary namenodes [datanode2]

hadoop@datanode1: ~ $ start-yarn.sh
Starting resourcemanager
Starting nodemanagers

停止过程应该输出类似:

hadoop@datanode1: ~ $ stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager

hadoop@namenode: ~ $ stop-dfs.sh
Stopping namenodes on [namenode]
Stopping datanodes
Stopping secondary namenodes [datanode2]

启动或停止过程不应该出现任何 WARNING 或报错信息。不应该出现 XXX did not exit gracefully 信息。

首次启动?

首次启动可能会出现这类警告信息:

datanode1: Warning: Permanently added 'datanode1' (ED25519) to the list of known hosts.
datanode2: Warning: Permanently added 'datanode2' (ED25519) to the list of known hosts.

这是首次 SSH 连接到其他服务器时的正常现象,不用担心。下次启动时应该就不会出现了。

如果出现这类警告信息:

datanode1: WARNING: /usr/local/hadoop/logs does not exist. Creating.
datanode2: WARNING: /usr/local/hadoop/logs does not exist. Creating.

这是 datanode1datanode2 首次运行 Hadoop 时正常产生的现象,因为没有日志目录,也不必担心。

三台服务器运行的后台任务

在三台服务器上以 hadoop 用户身份运行 jps6,应该得到以下输出(不分顺序):

  • namenode:
    NameNode
    NodeManager
    DataNode
    Jps
    
  • datanode1:
    ResourceManager
    NodeManager
    DataNode
    Jps
    
  • datanode2:
    SecondaryNameNode
    NodeManager
    DataNode
    Jps
    

Hadoop 集群节点

打开 Hadoop 控制面板,在顶部导航栏中选择 Datanodes,你应该看到类似这样的界面:

Hadoop 集群节点

如果有三个数据节点,那么你的 Hadoop 集群就安装并全部启动成功了。

YARN 节点

打开 YARN 控制面板,你应该看到类似这样的界面:

YARN 节点

如果红框位置有三个数据节点,那么你的 YARN 的配置就是正确的并启动成功了。

自动验证

我们开发了一个自动验证工具(目前仅可用于 Windows),你可以使用它验证自己的实验结果。

此处下载

※ 由于是独立开发应用,Microsoft Defender 反病毒应用程序可能误触发自动提交样本。

那以后呢?

未来,如果想要启停 Hadoop 环境,步骤如下:

  • 三台机器全部开机,随后:
  • namenode:
    • 登录到 hadoop 用户
    • 运行 start-dfs.sh
    • 结束,可输入 exit 退出登录
  • datanode1:
    • 登录到 hadoop 用户
    • 运行 start-yarn.sh
    • 结束,可输入 exit 退出登录
  • datanode2: 什么都不用做

如果需要停止 Hadoop 环境,将 start 替换为 stop 即可。

我没法关机?

Hadoop 为低权限用户,可能没有关机权限,也没有 sudo 权限。此时可以退出登录,重新登录到 super 用户再执行 poweroff 命令。

FAQ / 常见问题

以下是对一些实验中较为常见的问题的解答。

其它系统配置

Q
我可以使用其他的 Linux 系统作为虚拟机系统吗?我可以使用 Ubuntu 22.04 桌面版或者 20.04, 18.04 进行实验吗?我可以用我最喜欢的 Arch Linux / Gentoo / nixOS 吗?

A
当然可以7。但需要注意的是系统版本的不同可能导致一些实验细节上的不一致,难免会出现一些意料之外的问题。

hadoop-env.sh 文件未找到

Q
在安装 Java 时,当我修改 /usr/local/hadoop/etc/hadoop/hadoop-env.sh 的时候,提示我文件未找到,是怎么回事?

A
你可能在安装 Hadoop 时,在 sudo mv hadoop-3.3.6/* . 这个命令遗漏了末尾的点(.)符号。这会导致错误的移动行为。类似地,如果在安装 Hadoop 过程中,chown 命令报错,提示 chown: missing operand after ...,你可能也是遗漏了这个 . 点。

apt 无法连接

Q
在安装 Java 时,apt 命令刷屏且不执行安装,怎么办?

A
你有可能错误地在代理设置页面填写了镜像地址,而没有真正地更改镜像地址。请使用以下命令删除代理配置:

sudo rm /etc/apt/apt.conf.d/90curtin-aptproxy

随后使用:

sudo apt update

检查 apt 联网是否正常。

scp 连接超时

Q

我在尝试使用 scp 复制 Hadoop 包时,提示:

ssh: connect to host 192.168.178.100 port 22: Connection timed out

怎么办?

A
此问题常见于 Windows,可能是以下几种情况:

  1. 你为虚拟机设置错了子网,比如你的虚拟机所在的子网并不是 192.168.178.0/24 但你却设置成了这样
  2. 你的虚拟网卡缺失

你可以尝试:

  • 打开任务管理器
  • 切换到“性能”标签页
  • 检查是否有“以太网”图表,下方适配器名称为 VMware Network Adapter VMnet8(或与你的虚拟化软件对应的名称)
    任务管理器图表
    • 如果没有,或者只看到了“WLAN”与/或“以太网”,说明你的问题是上述第二种情况,你需要重新安装你的虚拟化软件
  • 点击该图表,查看“IPv4 地址”一栏,确定你所在的子网,如 192.168.110.1,对应的就是 192.168.110.0/24
  • 在虚拟机运行以下命令:
    sudo nano /etc/netplan/00-installer-config.yaml
    
  • 替换所有此前的“第三段数字”为你在任务管理器里看到的新的“第三段数字”(如本例子中的 178 应为 110
  • 保存,运行 sudo reboot 重新启动虚拟机

scp 无法确认连接

Q
我在 Windows 上复制 Hadoop 包时,我被提示:

The authenticity of host '192.168.178.100 (192.168.178.100)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

但是我输入 yes 时无反应,怎么办?

A
你的中文输入法(尤其是搜狗拼音)正在妨碍控制台输入,切换至英文模式,或切换输入法,再输入 yes 回车即可。

自动信任

你也可以使用以下命令自动信任虚拟机(注意修改成你虚拟机的 IP):

ssh -o BatchMode=yes -o StrictHostKeyChecking=no super@192.168.178.100

scp 命令未找到

Q
我在 Windows 上复制 Hadoop 包时,我被提示:

'scp' 不是内部或外部命令,也不是可运行的程序或批处理文件。

怎么办?

A
这通常意味着你的电脑并没有 scp 命令。你需要 Windows 10 April 2018 Update (1803, build 17134) 或更高版本,并且已经安装可选功能“OpenSSH 客户端”。你可以尝试以下步骤重新启用 scp 命令:

不想用命令行?

你也可以下载图形化应用 WinSCP 来替代 scp 命令进行文件传输。

安装过程需要网络连接。等待安装完成后,你应该就可以使用 scpssh 命令了。如果你没有看到这个可选功能,你可能正在使用偏旧的 Windows 10,可以运行 winver 命令确认“操作系统内部版本”(需 >17134)。

sshscp 提示远程指纹更改

Q
我因为问题重做了实验(重新安装了 OS), 但在 SSH 或 SCP 连接时,我遇到这样的警告,怎么办?

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

A
这是正常现象,是 OpenSSH 的安全功能之一。重新安装后会导致公钥发生变化而不匹配导致无法连接。你可以使用以下命令移除对此前公钥的记忆:

ssh-keygen -R 192.168.178.100

启动集群时提示权限拒绝

Q
我在启动 Hadoop 集群时,得到这种错误,怎么办?

datanode1: hadoop@datanode1: Permission denied (publickey,password).
datanode2: hadoop@datanode2: Permission denied (publickey,password).

A
你的公钥登录配置错误。请检查“克隆虚拟机”章节。

启动集群后看不到 datanode

Q
我的集群启动正常,但启动后在 Datanodes 页面看不到任何 datanode,如何解决?

A
你可能多次格式化了 HDFS,导致 cluster ID 不匹配。如要修复,请先确保集群未在运行,再在三台机器上删除 /usr/local/hadoop/data 目录,或者复制以下命令在任意节点执行:

command="rm -rf /usr/local/hadoop/data"
ssh namenode "$command"
ssh datanode1 "$command"
ssh datanode2 "$command"

并在 Namenode 上格式化一次 HDFS.

hdfs namenode -format

完成后,启动集群。

Changelog / 更新日志

以下为一些本手册的主要变化,可能不包括所有变更。

  • 2023/03/21
    • 根据实验结果,添加了两个常见问题解答
      • sshscp 提示远程指纹更改
      • 启动集群后看不到 datanode
  • 2023/03/11
    • 新增首次启动时日志目录不存在的警告信息提示
    • scp 命令用户名添加了提示
  • 2023/03/09
    • 调整 .editorconfig 配置
    • 修正了部分语法高亮
    • 调整了部分提示框的布局
  • 2023/03/04
    • 新增了首次启动过程中对 SSH 连接警告信息的提示
    • 新增了“权限拒绝”常见问题
    • 调整了“克隆虚拟机”章节结构
    • 调整了“常见问题”章节部分排版
  • 2023/02/28
    • 调整了部分信息框为默认收起
    • 新增了“代理设置”页面的截图
    • 新增了实验“成功的标志”章节
    • 新增了“常见问题”板块
    • 为部分操作增加了 ARM64 架构系统的特殊情况
  • 2023/02/27
    • 重新启用了底部导航
    • 增加了针对深信服 Web VPN 导致的文本错误的缓解措施
    • 增加了一定程度的反识别措施
    • 小幅度的排版调整
  • 2023/02/26
    • 针对深信服 Web VPN 导致的文本错误添加了警告
  • 2023/02/25
    • 适配 Ubuntu 20.04 → 22.04 安装过程中变化
    • 调整了软件下载部分的文本
    • 重新制作了所有配图 抓飞友
  • 2023/02/24
    • 修复 Ubuntu Server 22.04 LTS 下载链接
  • 2024/03/03
    • 修复死链
    • 更新了操作系统版本至 Ubuntu 22.04.4 LTS
    • 更新了 Hadoop 版本至 3.3.6
  • 2025/02/26
    • 更新了操作系统版本至 Ubuntu 22.04.5 LTS
    • 更新了 VMware Workstation Pro 以及 VMware Fusion 的下载方式

  1. 比如端口号等,目的是尽可能在后续实验中保持兼容性 

  2. 如果你是 Windows 10 专业版、教育版或企业版,你可以使用 Hyper-V 功能来管理虚拟机,可以实现同样的效果,你也可以在 Windows 上使用 VirtualBox 来替代 VMware 或 Hyper-V. 如果你已经启用了 WSL 2(“适用于 Linux 的 Windows 子系统”),则你已经正在使用 Hyper-V 了 

  3. 如果没有提示这个设置,可以忽略 

  4. 理论上可以用 openjdk-8-jdk-headless 来替换以消耗更小空间,但出于 Apache 软件的体量,使用完整版以避免特殊问题;经测试 Java 11 也可以正常运行 

  5. 链接克隆可以大幅节约硬盘空间,在本教程实例中大约可以节约 10 GiB 空间。链接克隆功能只在 VMware Workstation Pro 提供 

  6. 如果你只安装了 JRE,也是可以运行 Hadoop 的,但 jps 命令不包含在 JRE 中,需要 JDK 

  7. 事实上,本实验已经有过在 Arch Linux 和 Fedora 上成功完成的经验了。你甚至可以在 AUR 上找到现有的包