Apache Hadoop — 在一个 Pod 里搭起并运维 HDFS 与 YARN
把文件上传到单 Pod HDFS,并用两种方式读取
目标
确认在一个 Pod 中运行的伪分布式 HDFS 的配置和状态,上传一份访问日志,并通过 shell(hdfs dfs)和 HTTP(WebHDFS)两条路径读取。再通过 fileId 和块 ID 确认:移动文件(mv)只是修改 NameNode 中的名字。
为什么重要
HDFS 是把职责一分为二的文件系统。NameNode 在内存中保存目录树,以及“这个文件由哪些块组成、这些块在哪个 DataNode 上”的元数据;DataNode 则把块的字节作为文件保存在自己的磁盘上。客户端向 NameNode 询问位置,字节则直接与 DataNode 收发。
了解这种分离,就能解释运维中的许多现象。重命名和移动不触碰字节,所以无论大小都会立即完成;NameNode 一旦停止,即使字节完好无损,也什么都读不了。配置来自哪里(*-site.xml 会覆盖 *-default.xml)同样重要,原因相同——客户端和守护进程看到的配置不同,同一条命令就会表现不同。
WebHDFS 是通过 HTTP 向同一个 NameNode 发问的路径。无需 Java 客户端,只用一个 curl 就能拿到目录列表、状态和内容,所以脚本和监控大多走这条路径。
步骤
- 用
hdfs getconf -confKey查询fs.defaultFS、dfs.replication、dfs.blocksize,以키=값的格式写成三行,保存到 /root/hdp/first/conf.txt(占位符依次为配置键与值)。 - 把
hdfs dfsadmin -report的输出保存到 /root/hdp/first/report.txt。 - 在 HDFS 中创建 /user/root/first/logs 目录。
- 把
/data/logs/access-2026-03-01.log上传到 /user/root/first/logs/。 - 用
hdfs dfs -cat统计该文件的行数,并以整数写入 /root/hdp/first/lines.txt。 - 用 curl 调用 WebHDFS 的
LISTSTATUS,把 /user/root/first/logs 的目录列表响应保存到 /root/hdp/first/liststatus.json。 - 创建 /user/root/first/archive,把日志文件移动为 /user/root/first/archive/access-0301.log,然后把
hdfs fsck <새 경로> -files -blocks的输出保存到 /root/hdp/first/blocks.txt(占位符为新路径)。 - 在 /root/hdp/first/report.md 中写出
## 두 역할、## 두 길、## 이름만 바뀐다三个小节。第二节写入第 5 步的行数,第三节写入移动前后保持相同的 fileId。
参考
- HDFS 在 Pod 启动时已经开启(
lab-hadoop status)。如果已关闭,用lab-hadoop start开启。数据保留在 NameNode 和 DataNode 的磁盘上,重新开启后原样还在。 - 每条
hdfs dfs命令都是一个 JVM,需要 1–2 秒。用export HADOOP_ROOT_LOGGER=WARN,console减少日志,输出会更清爽。 - WebHDFS:
curl -s "http://localhost:9870/webhdfs/v1<경로>?op=LISTSTATUS&user.name=root"(占位符为路径)。获取内容的op=OPEN会转交给 DataNode(307),所以需要curl -L。 - 常见错误:混淆本地路径和 HDFS 路径(
/user/root/...在 HDFS 内),在 NameNode 启动之前就执行-report,以及以为 mv 会复制文件。 - 官方文档:HDFS Architecture · Pseudo-Distributed Operation · FileSystem Shell · WebHDFS REST API
配置来自哪里
用 hdfs getconf -confKey <키> 查询 fs.defaultFS、dfs.replication、dfs.blocksize 三个值,并像 fs.defaultFS=값 这样,以 키=값 的格式写成三行,保存到 /root/hdp/first/conf.txt(占位符依次为配置键与值)。
前两个是这个镜像在 core-site.xml 和 hdfs-site.xml 中改过的值,块大小没有人改过,所以显示的是 hdfs-default.xml 中的默认值。“site 文件覆盖默认文件”这条规则,在这三个值上都能看到。
NameNode 眼中的集群
把 hdfs dfsadmin -report 的输出保存到 /root/hdp/first/report.txt。
报告的上半部分是整个集群的情况(容量、使用量、副本不足的块),下半部分是每个 DataNode 的状态。请看存活的 DataNode 有几台、配置的容量是多少。评分器会从 NameNode 的 JMX 读取相同的数字来对照。
在 HDFS 中开辟位置
在 HDFS 中创建 /user/root/first/logs 目录(包括中间目录)。
使用 hdfs dfs -mkdir -p。目录只存在于 NameNode 的元数据中,DataNode 上什么都不会产生——目录没有块。
上传文件
把本地的 /data/logs/access-2026-03-01.log 以相同的名称上传到 HDFS 的 /user/root/first/logs/。
hdfs dfs -put 会向 NameNode 要到块的位置,再把字节流送往 DataNode。上传期间文件带着 ._COPYING_ 后缀的名字,结束后才变成正式名字。评分器会把长度和内容与本地原文件对照。
用 shell 读取
用 hdfs dfs -cat 读取 /user/root/first/logs/access-2026-03-01.log 并统计行数,把整数写入 /root/hdp/first/lines.txt。
hdfs dfs -cat 경로 | wc -l(占位符为 HDFS 路径)。字节直接来自 DataNode。也请自己对比一下行数是否与本地原文件相同。
用 HTTP 读取——WebHDFS
用 curl 请求 http://localhost:9870/webhdfs/v1/user/root/first/logs?op=LISTSTATUS&user.name=root,把响应 JSON 原样保存到 /root/hdp/first/liststatus.json。
响应的 FileStatuses.FileStatus 中,每个文件都带有长度、块大小、副本系数、所有者和 fileId(inode 编号)。请记住 fileId——下一步移动之后,要看它是否仍然相同。
移动只改名字
在 HDFS 中创建 /user/root/first/archive,并用 hdfs dfs -mv 把日志文件移动为 /user/root/first/archive/access-0301.log。然后把 hdfs fsck /user/root/first/archive/access-0301.log -files -blocks 的输出保存到 /root/hdp/first/blocks.txt。
mv 只在 NameNode 内部修改名字。所以 fileId 不变,块 ID 也不变,即使文件有 1TB,也会立即完成。评分器会把你在第 6 步保存的 fileId 与现在的 fileId 对照,也会把你保存的块 ID 与现在的块 ID 对照。
用数字记录两种职责
在 /root/hdp/first/report.md 中写出 ## 두 역할、## 두 길、## 이름만 바뀐다 三个小节。第二节写入第 5 步的行数,第三节以数字写入移动前后保持相同的 fileId。
第一节写 NameNode 和 DataNode 各自持有什么,第二节写 shell 和 WebHDFS 是如何呈现同一个文件的,第三节写 mv 之后什么保持不变。