了解你的 Hadoop 环境

LinuxBeginner
立即练习

介绍

你已经会向 HDFS 上传文件,但终端究竟把文件发送到了哪里?零售商的每日文件可能保存在笔记本电脑、当前服务器或共享存储中。读取了错误的副本,即使计算过程完全正确,使用的也可能是错误的数据。在管理更多文件之前,你需要辨认命令所访问的存储。

Hadoop 将不同职责分开。Hadoop Common 提供共享库和工具。HDFS 存储文件。MapReduce 描述并执行批处理任务。YARN 为应用程序分配资源,其中也包括 MapReduce 作业。你会逐步使用这些名称;今天先检查存储和配置,不运行计算,也不安装服务。

本实验有三个目标:找到默认文件系统,证明完全相同的路径文本也可能指向不同文件,以及辨认正在运行的 HDFS 服务。最后,你将保存从自己环境中获取的观察结果。所有实验数据均独立准备,不依赖上一个实验。请使用终端完成操作,无需编程。

找到已配置的目标位置

在这一步中,你将找到默认文件系统,并读取配置中选择的 MapReduce 执行方式。

终端运行的是客户端(client)命令。客户端请求服务完成工作;服务可以在当前机器上,也可以在另一台机器上。配置会将客户端的简短命令连接到正确目标。先进入本地工作目录:

cd /home/labex/project

hdfs getconf 命令读取 Hadoop 配置。它的 -confKey 选项用于查询指定名称的设置。fs.defaultFS 表示 Hadoop 文件系统路径未明确指定访问方案时使用的默认文件系统:

hdfs getconf -confKey fs.defaultFS

预期值如下:

hdfs://localhost:9000

这是一个 URI(统一资源标识符),即包含资源访问方式的地址。这里,hdfs 选择 HDFS,localhost 表示当前机器,9000 是服务的连接端口。端口用于标识服务使用的网络端点。你不需要自行开放该端口。

保存观察到的值。与第一个实验一样,> 将命令输出写入本地文件,并替换其中原有的内容:

hdfs getconf -confKey fs.defaultFS > /home/labex/project/output/default-filesystem.txt

Hadoop 的配置文件使用 XML:每个属性都有 name 和 value。现在只需要读取其中一个属性。grep 选出匹配的文本行,-A 1 则额外显示匹配行紧接着的下一行:

grep -A 1 '<name>mapreduce.framework.name</name>' /etc/labex-bigdata/hadoop/mapred-site.xml

相关的两行如下:

    <name>mapreduce.framework.name</name>
    <value>yarn</value>

yarn 表示 MapReduce 应用已配置为使用 YARN 管理资源。仅凭这个设置不能证明有应用正在运行。本实验启动了 HDFS;等你学习提交作业时,才会使用计算服务。

保存这些配置行作为证据,不要自己输入预期值:

grep -A 1 '<name>mapreduce.framework.name</name>' /etc/labex-bigdata/hadoop/mapred-site.xml > /home/labex/project/output/execution-setting.txt

对于一张很小的临时表,本地文件系统可能就够用了。对于供 Hadoop 作业共享的归档文件,HDFS 目标位置则很重要。选择工具应从实际需要出发,不必把每个文件都自动上传到 Hadoop。

在两个文件系统中解析同一路径

在这一步中,你将读取两个路径文本完全相同的预置文件,并证明每条命令选择了哪个文件系统。

为了便于本次对比,初始化过程在两个文件系统的 /home/labex/project/data/location.txt 位置各放置了一份内容不同的文件。本地文件系统与 HDFS 拥有独立的目录树,因此能够做到这一点。课程通常使用的 HDFS 工作目录是 /user/labex;今天特意使用相同路径,让区别更容易观察。

file:/// URI 明确选择本地文件系统。三个斜杠由访问方案分隔符与绝对路径开头的斜杠组合而成。运行下一条命令前,先预测它会读取本地版本还是共享版本:

hdfs dfs -cat file:///home/labex/project/data/location.txt

预期输出如下:

Local store: draft product file

尽管使用的是 Hadoop 客户端,URI 选择的却是本地文件。现在使用第 1 步观察到的服务地址,明确选择 HDFS:

hdfs dfs -cat hdfs://localhost:9000/home/labex/project/data/location.txt

预期输出如下:

HDFS store: shared product file

最后,省略访问方案和服务地址。预测第 1 步中的默认配置会选择哪个版本:

hdfs dfs -cat /home/labex/project/data/location.txt

显示的是共享的 HDFS 版本。绝对路径确定的是文件系统内部的位置,它本身并不选择文件系统。普通 Linux 命令 cat /home/labex/project/data/location.txt 仍会读取本地版本。

分别保存这三次结果,以便将预测与实际证据比较:

hdfs dfs -cat file:///home/labex/project/data/location.txt > /home/labex/project/output/local-result.txt
hdfs dfs -cat hdfs://localhost:9000/home/labex/project/data/location.txt > /home/labex/project/output/hdfs-result.txt
hdfs dfs -cat /home/labex/project/data/location.txt > /home/labex/project/output/default-result.txt

明确指定 HDFS 和使用默认配置得到的结果应该相同。使用 diff 比较;文件相同时,它不会输出任何内容:

diff /home/labex/project/output/hdfs-result.txt /home/labex/project/output/default-result.txt

这个实验解释了为什么排错时仅看路径容易产生误解:既要检查路径,也要检查它所属的文件系统。

辨认存储服务

在这一步中,你将把文件操作与 NameNode、DataNode 的职责联系起来,并汇总对环境的观察结果。

HDFS 将文件的名称与位置信息和文件的数据分开管理。NameNode 管理目录树,并知道哪些 DataNode 保存了文件的数据块。DataNode 存储这些块并提供文件内容。可以把它们想象成图书馆目录与书架:目录帮助找到一本书,书架则存放书中的页面。

HDFS 客户端 → NameNode:询问文件数据在哪里
HDFS 客户端 ↔ DataNode:传输文件数据

块(block)是 HDFS 管理的文件的一部分。后续你会直接检查块和副本。现在先检查负责这两个角色的服务是否处于活动状态。systemctl is-active 向操作系统查询指定服务的状态;这条命令只观察状态:

systemctl is-active labex-hdfs-namenode labex-hdfs-datanode

应该看到两行 active,每行对应一个服务。保存这一观察结果:

systemctl is-active labex-hdfs-namenode labex-hdfs-datanode > /home/labex/project/output/storage-services.txt

HDFS 也会报告它所看到的存储节点情况。dfsadmin -report 是只读的管理报告。下面的命令通过 sudo -u hdfs 使用预配置的 hdfs 服务身份,仅用于读取这份报告;日常文件操作仍应使用你自己的 labex 身份:

sudo -u hdfs /usr/local/bin/hdfs dfsadmin -report

查找 Live datanodes (1),以及 Decommission Status 为 Normal 的节点。容量、已用空间、主机标识和时间戳会变化,无需与其他学习者的虚拟机相同。存活节点表示它正在与 NameNode 通信,Normal 则表示它未处于退役过程中。

保存报告:

sudo -u hdfs /usr/local/bin/hdfs dfsadmin -report > /home/labex/project/output/storage-report.txt

这是单节点伪分布式模式:不同的 Hadoop 服务进程运行在一台机器上。在本地模式中,程序可以不使用 HDFS 服务,直接处理本地文件;在多机集群中,服务和存储分布在不同主机上。这里看到一个 DataNode,并不能演示整台机器发生故障后仍可继续工作。

以后提交作业时,YARN 的 ResourceManager 将分配资源,NodeManager 则会管理各工作机器上的任务。今天的存储观察不需要运行作业。

将保存的观察结果连接起来,形成一份简短报告。cat 按顺序接受多个本地输入路径;> 保存它们合并后的内容:

cat /home/labex/project/output/default-filesystem.txt /home/labex/project/output/execution-setting.txt /home/labex/project/output/storage-services.txt /home/labex/project/output/storage-report.txt > /home/labex/project/output/environment-report.txt

读回报告:

cat /home/labex/project/output/environment-report.txt

找到文件系统 URI、yarn 设置、两个服务状态和存活节点数量。现在,你已有证据将命令与实际环境联系起来。接下来,你将在正确的文件系统内管理文件的完整生命周期。

总结

你检查了已配置的文件系统和执行方式,再通过本地路径、明确指定的 HDFS 路径与默认路径证明数据来自哪里。你将这些结果与 NameNode 管理元数据、DataNode 存储数据的职责联系起来,也认识了单机学习环境的局限。

接下来的任务是有意识地管理输入:复制、归档、导出、统计,并只删除指定的临时文件。