一、HDFS基础知识
1. hadoop是什么?
Hadoop 是 Apache 基金会开发的开源大数据处理框架,可以让很多台电脑(组成集群)像一台电脑一样协作,完成海量数据的存储和计算。 它使用简单的编程模型,处理速度快、扩展性强。
hadoop三大核心组件
HDFS(分布式文件系统):解决大数据的存储问题。
YARN(资源管理器):负责集群资源分配和任务调度。
MapReduce(计算框架):解决大数据的计算问题。
2. HDFS 介绍
HDFS 全称 Hadoop Distributed File System,即 Hadoop 分布式文件系统。 它会把文件切成多个块(Block),分散存储在不同的服务器上。
HDFS 的四个角色:
客户端(Client):上传/下载文件,发出请求。
主节点(NameNode):管理文件目录、块位置等元数据。
数据节点(DataNode):保存文件块数据。
次级主节点(Secondary NameNode):帮忙定期合并和备份元数据。
HDFS文件存储特点:
分块存储:默认一个块大小是 128MB。
多副本:每个块默认保存 3 个副本,防止数据丢失。
高可用:节点坏了,系统会在其他节点上自动补齐副本。
HDFS架构图

NameNode中元数据存储问题及工作机制
Namenode是HDFS集群主节点,负责管理整个文件系统的元数据,所有的读写请求都要经过Namenode。

3. HDFS 数据读写流程
HDFS的写数据流程

流程解读:
客户端告诉 NameNode “我要上传一个文件”。
NameNode 检查并分配存储位置(选择合适的 DataNode)。
客户端把数据块发送到第一个 DataNode。
第一个 DataNode 再把数据复制到第二个、第三个 DataNode(管道复制)。
DataNode 成功写入后向 NameNode 报告。
HDFS的读数据流程

流程解读:
客户端向 NameNode 请求“某文件在哪些节点”。
NameNode 返回最近的 DataNode 地址。
客户端直接从 DataNode 下载数据。
5. NameNode 的元数据管理
元数据是什么? 就是文件的“说明书”:
文件名、大小
文件块的数量和位置
每个块的副本在哪些节点
存储方式:
内存:快速响应请求(怕断电丢失)
FsImage 文件:磁盘保存的快照
Edits 文件:记录每次文件系统变化(日志)
Secondary NameNode 的作用:
定期合并 FsImage 和 Edits,防止日志太大
帮 NameNode 恢复数据
场景:淘宝的商品数据存储
在淘宝这样的电商平台,每天都有海量商品信息、库存、价格等数据存储在 HDFS 里。
内存(NameNode 元数据内存)
存放着“商品目录表”,比如某件商品的文件名、存在哪些 DataNode、每个副本的位置等。
放在内存里,查询速度快(买家搜索商品时几乎秒出结果),但一旦服务器断电,这些内存数据会丢失。
FsImage 文件(磁盘快照)
定期保存商品目录的完整快照,比如“昨天 0 点所有商品的位置和信息”,就像一次全量备份。
存在磁盘里,断电也不会丢。
Edits 文件(操作日志)
每当商家上架新商品、改库存、改价格时,这些变化会立刻记录到 Edits 日志中。
这样不用每次都改全量快照,节省性能。
Secondary NameNode(合并员)
定期把快照(FsImage)和变化日志(Edits)合并,生成最新的商品目录快照。
防止 Edits 文件无限增长,也让系统重启时恢复更快。
📌 如果没有这套机制会怎样?
没有 FsImage:系统断电,商品位置全忘,买家就搜不到商品。
没有 Edits:每改一次价格都要改全量快照,性能会慢得不可接受。
没有 Secondary NameNode:日志文件太大,系统重启恢复时会很慢,甚至卡死。
3. HDFS实践
接下来介绍Linux操作系统中关于HDFS文件操作的常用Shell命令,利用Web界面查看和管理Hadoop文件系统,
启动Hadoop
start-dfs.sh # 在master启动hdfs
start-yarn.sh # 在slave1启动yarn3.1 利用Shell命令与HDFS进行交互
在 Hadoop 中,我们常用 hdfs dfs 命令和 HDFS 文件系统进行交互。 它可以完成查看文件、上传下载、删除、创建目录等操作。
基本格式:
hdfs dfs [选项]
示例:
hdfs dfs -ls /
解释:列出 HDFS 根目录 / 下的文件和目录。
说明:
以前还有
hadoop fs命令,但为了简单和统一,课堂只学习hdfs dfs一种方式即可。hdfs dfs是 专门 操作 HDFS 的命令,记忆简单,日常使用也更常见。
我可以帮你直接配一份 hdfs dfs 常用命令对照表,学生看一页就能上手。这样实验课会很顺利。
3.2 利用Web界面管理HDFS
# 在浏览器中输入地址
http://master:9870
或者 192.168.36.100:9870依次点击Utilities - Browse the file system)

3.3 HDFS Shell 命令速查表
| 操作 | 命令 | 示例 | 说明 |
|---|---|---|---|
| 查看目录 | hdfs dfs -ls <路径> | hdfs dfs -ls / | 查看指定路径下的文件和目录 |
| 创建目录 | hdfs dfs -mkdir <路径> | hdfs dfs -mkdir /data | 在 HDFS 中创建 /data 目录 |
| 上传文件 | hdfs dfs -put <本地文件> <HDFS路径> | hdfs dfs -put a.txt /data | 将本地文件 a.txt 上传到 /data 目录 |
| 下载文件 | hdfs dfs -get <HDFS文件> <本地路径> | hdfs dfs -get /data/a.txt ./ | 从 HDFS 下载 a.txt 到当前目录 |
| 删除文件/目录 | hdfs dfs -rm [-r] <路径> | hdfs dfs -rm /data/a.txt``hdfs dfs -rm -r /data | 删除文件或目录(-r 表示递归删除) |
| 查看文件内容 | hdfs dfs -cat <路径> | hdfs dfs -cat /data/a.txt | 在终端直接显示文件内容 |
| 移动文件 | hdfs dfs -mv <原路径> <新路径> | hdfs dfs -mv /data/a.txt /backup/ | 将文件移动到新目录 |
| 复制文件 | hdfs dfs -cp <原路径> <新路径> | hdfs dfs -cp /data/a.txt /backup/ | 在 HDFS 内部复制文件 |
| 查看磁盘空间 | hdfs dfs -du [-h] <路径> | hdfs dfs -du -h /data | 显示目录下文件大小(-h 人性化单位) |
📌 课堂提示
所有命令都以
hdfs dfs开头。路径
/表示 HDFS 根目录,不是 Linux 本地根目录。上传(
-put)和下载(-get)操作是课堂实验中最常用的。
二、HDFS 练习
1. HDFS目录操作
1.1 用户家目录
在 Hadoop 系统安装完成后,第一次使用 HDFS 时,通常需要为每个用户在 HDFS 中创建用户的家目录,路径格式为 /[父目录]/[用户名]。例如,如果用户名是 root,则家目录为 /user/root。
默认操作路径:
使用
hdfs dfs命令操作文件时,默认操作路径是用户的家目录。例如,用户root的家目录路径通常是/user/root。如果没有明确指定其他路径,文件操作都会在该家目录中进行。父目录路径:
HDFS 中所有用户的家目录的上级目录通常是
/user。该路径由hdfs-site.xml配置文件中的dfs.user.home.dir.prefix参数定义,默认值是/user。/user是用户家目录的父目录,[用户名]则是该用户的家目录。
1.2 常用目录操作命令
| 操作 | 命令 | 示例 | 说明 |
|---|---|---|---|
| 创建家目录 | hdfs dfs -mkdir -p <路径> | hdfs dfs -mkdir -p /user/root | -p 表示可一次性创建多级目录 |
| 创建子目录 | hdfs dfs -mkdir <目录名> | hdfs dfs -mkdir input | 在家目录 /user/root 下创建 input |
| 创建根目录下目录 | hdfs dfs -mkdir /input | hdfs dfs -mkdir /inputdata | 在 / 下直接创建目录 |
| 查看当前目录 | hdfs dfs -ls . | hdfs dfs -ls | . 表示当前用户家目录 |
| 查看根目录 | hdfs dfs -ls / | hdfs dfs -ls -R / | -R 递归列出子目录 |
| 删除目录 | hdfs dfs -rm -r <路径> | hdfs dfs -rm -r /inputdata | -r 递归删除目录,-f 强制忽略不存在文件 |
| 修改权限 | hdfs dfs -chmod 755 <路径> | hdfs dfs -chmod 755 /input | 755 表示:所有者读/写/执行,组和其他用户读/执行 |
| 修改所有者 | hdfs dfs -chown 用户:组 <路径> | hdfs dfs -chown root:root /input |
1.3 在 HDFS 中为 root 用户创建用户家目录
hdfs dfs -mkdir -p /user/root
# -p: 创建多级目录命令解释:
hdfs dfs -mkdir:创建目录的命令。-p:如果目录路径中包含多级目录,则会创建所有必要的父目录。/user/root:这是root用户在HDFS中的家目录。
1.4 在 root 用户家目录下创建一个 input 目录
hdfs dfs -mkdir input
# 创建 input 目录在 /user/root 下1.5 在根目录下创建 input 和 inputdata 目录
hdfs dfs -mkdir /input
hdfs dfs -mkdir /inputdata
# 创建 /input 和 /inputdata 目录在 HDFS 根目录下1.6 显示HDFS中当前用户的目录内容
# 列出root用户在HDFS家目录中的文件
hdfs dfs -ls .命令解释:
hdfs dfs -ls:列出指定目录下的所有内容。.表示当前用户的家目录。对于root用户来说,这相当于列出/user/root目录的内容。上述命令与以下命令等效:
# 默认会查看当前用户在 HDFS 中的家目录,如果用户是root,则就是“/user/root”目录
# 等效命令:hdfs dfs -ls == hdfs dfs -ls . == hdfs dfs -ls /user/root
hdfs dfs -ls .
hdfs dfs -ls /user/root
hdfs dfs -ls注意:如果在
hdfs dfs -ls命令后未指定路径,则会默认列出/user/用户名/目录下的文件。
1.7 列出HDFS根目录的内容
hdfs dfs -ls / #列出HDFS的根目录下的所有内容
hdfs dfs -ls -R / #列出HDFS的根目录下的所有内容及子目录1.8 删除根目录下的 inputdata 目录
hdfs dfs -rm -r /inputdata
# 递归删除 /inputdata 目录命令解释:
hdfs dfs -rm:删除文件或目录的命令。-r:递归删除目录及其子目录。-f:忽略不存在的文件,强制删除,不提示确认。注意:如果要删除的目录包含子目录,必须使用
-r参数,否则删除操作将失败。
1.9 修改 input 目录的权限
# 修改 /input 目录的权限为 755
hdfs dfs -chmod 755 /input解释:
755:权限模式,采用八进制表示,代表文件或目录的权限:
7:所有者(用户)有读(r)、写(w)、执行(x) 权限。
5:所属组有读(r)、执行(x) 权限,没有写权限。
5:其他用户有读(r)、执行(x) 权限,没有写权限。
1.10 将 /input 目录的所有者和所属组修改为 root
hdfs dfs -chown root:root /input
# 修改 /input 的所有者和组为 root解释:
第一个
root:目录的所有者。第二个
root:目录的所属组。
2. 文件操作
常用文件操作命令
| 操作 | 命令 | 示例 | 说明 |
|---|---|---|---|
| 上传文件 | hdfs dfs -put <本地文件> <HDFS路径> | hdfs dfs -put /opt/data/zhang.txt input | 将本地文件上传到 HDFS 指定目录 |
| 下载文件 | hdfs dfs -get <HDFS文件> <本地路径> | hdfs dfs -get /user/root/input/zhang.txt /opt/data/zhao.txt | 将 HDFS 文件下载到本地 |
| 查看文件列表 | hdfs dfs -ls <路径> | hdfs dfs -ls input | 列出指定目录下的文件和目录 |
| 查看文件内容 | hdfs dfs -cat <HDFS文件> | hdfs dfs -cat input/zhang.txt | 在终端输出 HDFS 文件的内容 |
| 追加内容到文件 | hdfs dfs -appendToFile <本地文件> <HDFS文件> | hdfs dfs -appendToFile new_content.txt /user/root/input/zhang.txt | 将本地文件内容追加到 HDFS 目标文件末尾 |
| 实时查看文件尾部 | hdfs dfs -tail -f <HDFS文件> | hdfs dfs -tail -f /user/root/input/zhang.txt | 持续输出文件末尾内容,常用于监控日志 |
| 复制文件(HDFS) | hdfs dfs -cp <原路径> <新路径> | hdfs dfs -cp input/zhang.txt /input | 在 HDFS 内部复制文件 |
| 删除文件 | hdfs dfs -rm [-r] [-f] <路径> | hdfs dfs -rm -f /input/zhang.txt | 删除文件或目录,-r 递归删除,-f 强制忽略不存在文件 |
| 递归查看所有文件 | hdfs dfs -ls -R [-h] <路径> | hdfs dfs -ls -R -h / | -R 递归列出文件,-h 以人类可读格式显示文件大小 |
2.1 在本地文件系统中创建 zhang.txt 文件并编辑内容
# 创建目录
mkdir -p /opt/data
cd /opt/data
# 创建文件
touch zhang.txt
# 使用 vim 编辑器编辑文件内容 或者 双击编辑
vim zhang.txt
# 添加以下内容
Hadoop2.2 将本地 zhang.txt 文件上传到 HDFS 的 input 目录
hdfs dfs -put /home/root/zhang.txt input
2.3 查看文件是否成功上传到 input 目录
# 列出 /user/root/input 目录中的文件
hdfs dfs -ls input2.4 使用 cat 命令查看 HDFS 中 zhang.txt 文件内容
hdfs dfs -cat input/zhang.txt
2.5 实时监控 zhang.txt 文件的新增内容
hdfs dfs -tail -f /user/root/input/zhang.txt
# -tail:读取并显示文件的最后几行内容。
# -f:持续输出文件末尾的内容,如果文件内容发生更新,它会自动显示新的内容。常用于实时监控文件日志。在另一个终端窗口向 zhang.txt 文件追加内容:
# 编辑文本
vi /opt/data/new_content.txt # 添加编辑内容:python
# 向HDFS上的文件追加内容
hdfs dfs -appendToFile new_content.txt /user/root/input/zhang.txt
# -appendToFile:将一个本地文件的内容追加到 HDFS 中的目标文件的末尾2.6 将 zhang.txt 文件从 HDFS 用户家目录复制到 HDFS 根目录 input 目录
hdfs dfs -cp input/zhang.txt /input
2.7 强制删除根目录 input 中的 zhang.txt 文件
# 强制递归删除指定目录及其所有子目录和文件,【-f 忽略不存在的文件或目录,不提示确认。】
hdfs dfs -rm -f /input/zhang.txt2.8 将 zhang.txt 文件从 HDFS 下载到本地
hdfs dfs -get /user/root/input/zhang.txt /opt/data/zhao.txt
2.9 输出 HDFS 根目录下所有文件的详细信息
# 递归输出 HDFS 根目录下的所有文件信息
hdfs dfs -ls -R -h /
# 查看本地的/opt/software/下的文件信息
ls -h /opt/software解释:
hdfs:Hadoop 文件系统命令工具。
dfs:执行 HDFS 上的文件操作。
-l:显示文件详细信息(权限、大小等)。
-h:以易读格式显示文件大小(KB、MB、GB)。
三、HDFS 综合实验
1、实验目标
熟悉 HDFS 的基本操作(目录管理、文件操作、权限管理)。
理解 HDFS 与本地文件系统的区别。
学会在实验结束后清理数据,保证环境整洁。
2、实验背景比喻
👉 把 HDFS 想象成 一栋学生宿舍楼:
根目录
/就像是宿舍大楼的大厅。/user/root是“root 同学”的宿舍房间。文件就像书和资料,放进宿舍柜子(HDFS)。
复制 / 移动 → 把书在不同柜子间调整位置。
权限修改 → 决定谁能看、谁能动你的资料。
清理 → 实验完把宿舍恢复整洁,不留垃圾。
3、实验步骤
步骤 1:准备与确认
确认 Hadoop 已启动:
start-dfs.sh
hdfs dfs -ls /如果没有
/user/root,创建 root 用户的宿舍房间:hdfs dfs -mkdir -p /user/root
步骤 2:创建目录
在
/user/root下创建一个experiment子目录:hdfs dfs -mkdir /user/root/experiment在根目录
/下创建一个公共目录/project:hdfs dfs -mkdir /project
步骤 3:上传文件
在本地创建两个文件:
mkdir -p /opt/data
echo "HDFS First File" > /opt/data/file1.txt
echo "HDFS Second File" > /opt/data/file2.txt上传到 HDFS:
hdfs dfs -put /opt/data/file1.txt /user/root/experiment
hdfs dfs -put /opt/data/file2.txt /user/root/experiment查看上传结果:
hdfs dfs -ls /user/root/experiment
步骤 4:文件操作
复制文件到
/project:hdfs dfs -cp /user/root/experiment/file1.txt /project/file1_copy.txt移动文件到
/project:hdfs dfs -mv /user/root/experiment/file2.txt /project/file2.txt查看文件内容:
hdfs dfs -cat /project/file1_copy.txt
步骤 5:权限与空间
修改
/project目录权限:hdfs dfs -chmod 755 /project修改
/project所有者为 root:hdfs dfs -chown root:root /project查看
/project磁盘占用情况:hdfs dfs -du -h /project
步骤 6:下载验证
从 HDFS 下载文件回本地:
hdfs dfs -get /project/file1_copy.txt /opt/data/local_file1.txt验证内容:
cat /opt/data/local_file1.txt
步骤 7:清理实验数据
👉 为保证环境整洁,把创建的目录和文件全部删除:
hdfs dfs -rm -r -f /user/root/experiment
hdfs dfs -rm -r -f /project验证是否已清理:
hdfs dfs -ls /user/root
hdfs dfs -ls /