李翔-大数据技术

Big data technology!

第04章 HDFS基础知识

一、HDFS基础知识


1. hadoop是什么?

Hadoop 是 Apache 基金会开发的开源大数据处理框架,可以让很多台电脑(组成集群)像一台电脑一样协作,完成海量数据的存储和计算 它使用简单的编程模型,处理速度快、扩展性强。

hadoop三大核心组件

  • HDFS(分布式文件系统):解决大数据的存储问题

  • YARN(资源管理器):负责集群资源分配任务调度

  • MapReduce(计算框架):解决大数据的计算问题


2. HDFS 介绍

HDFS 全称 Hadoop Distributed File System,即 Hadoop 分布式文件系统。 它会把文件切成多个块(Block),分散存储在不同的服务器上。

HDFS 的四个角色:

  1. 客户端(Client):上传/下载文件,发出请求。

  2. 主节点(NameNode):管理文件目录、块位置等元数据。

  3. 数据节点(DataNode):保存文件块数据。

  4. 次级主节点(Secondary NameNode):帮忙定期合并和备份元数据。


HDFS文件存储特点:

  • 分块存储:默认一个块大小是 128MB

  • 多副本:每个块默认保存 3 个副本,防止数据丢失。

  • 高可用:节点坏了,系统会在其他节点上自动补齐副本。


HDFS架构图

img



NameNode中元数据存储问题及工作机制

Namenode是HDFS集群主节点,负责管理整个文件系统的元数据,所有的读写请求都要经过Namenode。

img

3. HDFS 数据读写流程

HDFS的写数据流程

image-20220927083127624

流程解读:

  1. 客户端告诉 NameNode “我要上传一个文件”。

  2. NameNode 检查并分配存储位置(选择合适的 DataNode)。

  3. 客户端把数据块发送到第一个 DataNode。

  4. 第一个 DataNode 再把数据复制到第二个、第三个 DataNode(管道复制)。

  5. DataNode 成功写入后向 NameNode 报告。


HDFS的读数据流程

image-20220927083450102

流程解读:

  1. 客户端向 NameNode 请求“某文件在哪些节点”。

  2. NameNode 返回最近的 DataNode 地址。

  3. 客户端直接从 DataNode 下载数据。


5. NameNode 的元数据管理

元数据是什么? 就是文件的“说明书”:

  • 文件名、大小

  • 文件块的数量和位置

  • 每个块的副本在哪些节点

存储方式:

  • 内存:快速响应请求(怕断电丢失)

  • FsImage 文件:磁盘保存的快照

  • Edits 文件:记录每次文件系统变化(日志)

Secondary NameNode 的作用:

  • 定期合并 FsImage 和 Edits,防止日志太大

  • 帮 NameNode 恢复数据


场景:淘宝的商品数据存储

在淘宝这样的电商平台,每天都有海量商品信息、库存、价格等数据存储在 HDFS 里。

  1. 内存(NameNode 元数据内存)

    • 存放着“商品目录表”,比如某件商品的文件名、存在哪些 DataNode、每个副本的位置等。

    • 放在内存里,查询速度快(买家搜索商品时几乎秒出结果),但一旦服务器断电,这些内存数据会丢失。

  2. FsImage 文件(磁盘快照)

    • 定期保存商品目录的完整快照,比如“昨天 0 点所有商品的位置和信息”,就像一次全量备份。

    • 存在磁盘里,断电也不会丢。

  3. Edits 文件(操作日志)

    • 每当商家上架新商品、改库存、改价格时,这些变化会立刻记录到 Edits 日志中。

    • 这样不用每次都改全量快照,节省性能。

  4. 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启动yarn


3.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

image-20220606103439462



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 /inputhdfs 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 /input755 表示:所有者读/写/执行,组和其他用户读/执行
修改所有者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 在根目录下创建 inputinputdata 目录

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
# 添加以下内容
Hadoop

2.2 将本地 zhang.txt 文件上传到 HDFS 的 input 目录

hdfs dfs -put /home/root/zhang.txt input

2.3 查看文件是否成功上传到 input 目录

# 列出 /user/root/input 目录中的文件
hdfs dfs -ls input

2.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.txt

2.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、实验目标

  1. 熟悉 HDFS 的基本操作(目录管理、文件操作、权限管理)。

  2. 理解 HDFS 与本地文件系统的区别。

  3. 学会在实验结束后清理数据,保证环境整洁。


2、实验背景比喻

👉 把 HDFS 想象成 一栋学生宿舍楼

  • 根目录 / 就像是宿舍大楼的大厅。

  • /user/root 是“root 同学”的宿舍房间。

  • 文件就像书和资料,放进宿舍柜子(HDFS)。

  • 复制 / 移动 → 把书在不同柜子间调整位置。

  • 权限修改 → 决定谁能看、谁能动你的资料。

  • 清理 → 实验完把宿舍恢复整洁,不留垃圾。


3、实验步骤

步骤 1:准备与确认

  1. 确认 Hadoop 已启动:

    start-dfs.sh
    hdfs dfs -ls /
  2. 如果没有 /user/root,创建 root 用户的宿舍房间:

    hdfs dfs -mkdir -p /user/root

步骤 2:创建目录

  1. /user/root 下创建一个 experiment 子目录:

    hdfs dfs -mkdir /user/root/experiment
  2. 在根目录 / 下创建一个公共目录 /project

    hdfs dfs -mkdir /project

步骤 3:上传文件

  1. 在本地创建两个文件:

    mkdir -p /opt/data
    echo
    "HDFS First File" > /opt/data/file1.txt

    echo "HDFS Second File" > /opt/data/file2.txt
  2. 上传到 HDFS:

    hdfs dfs -put /opt/data/file1.txt /user/root/experiment
    hdfs dfs -put /opt/data/file2.txt /user/root/experiment
  3. 查看上传结果:

    hdfs dfs -ls /user/root/experiment

步骤 4:文件操作

  1. 复制文件/project

    hdfs dfs -cp /user/root/experiment/file1.txt /project/file1_copy.txt
  2. 移动文件/project

    hdfs dfs -mv /user/root/experiment/file2.txt /project/file2.txt
  3. 查看文件内容

    hdfs dfs -cat /project/file1_copy.txt

步骤 5:权限与空间

  1. 修改 /project 目录权限:

    hdfs dfs -chmod 755 /project
  2. 修改 /project 所有者为 root:

    hdfs dfs -chown root:root /project
  3. 查看 /project 磁盘占用情况:

    hdfs dfs -du -h /project

步骤 6:下载验证

  1. 从 HDFS 下载文件回本地:

    hdfs dfs -get /project/file1_copy.txt /opt/data/local_file1.txt
  2. 验证内容:

    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 /



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1