第二章:Hadoop 分布式文件系统 HDFS


文档摘要

第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System) 第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System) 2.1 HDFS 概述 随着数据爆炸式增长,传统的文件系统在存储和处理大规模数据集时面临诸多挑战: 存储容量限制: 单机存储容量有限,无法满足海量数据存储需求。 数据可靠性: 单点故障风险高,数据容易丢失。 数据访问效率: 单机处理能力有限,难以支撑高并发、高吞吐量的数据访问。 HDFS 正是为了解决这些挑战而诞生的。它是一个分布式、可扩展、高容错的文件系统,专为存储和处理大规模数据集而设计。

第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System)

第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System)

2.1 HDFS 概述

随着数据爆炸式增长,传统的文件系统在存储和处理大规模数据集时面临诸多挑战:

  • 存储容量限制: 单机存储容量有限,无法满足海量数据存储需求。

  • 数据可靠性: 单点故障风险高,数据容易丢失。

  • 数据访问效率: 单机处理能力有限,难以支撑高并发、高吞吐量的数据访问。

HDFS 正是为了解决这些挑战而诞生的。它是一个分布式、可扩展、高容错的文件系统,专为存储和处理大规模数据集而设计。

HDFS 的关键特性:

  • 分布式存储: 数据被分割成块 (Blocks) 分布存储在集群中的多台计算机上,突破了单机存储容量的限制。

  • 高容错性: 通过数据冗余备份 (Replication) 机制,即使部分节点发生故障,数据仍然安全可靠。

  • 高吞吐量: 针对大数据批量访问模式进行优化,提供高吞吐量的数据读写能力。

  • 流式数据访问: 支持一次写入、多次读取的访问模式,适合批处理应用。

  • 数据本地性: 将计算任务调度到数据存储节点附近执行,减少数据传输开销,提高计算效率。

  • 可扩展性: 可以方便地通过增加节点来扩展存储容量和处理能力。

HDFS 适用场景:

  • 海量数据存储: 存储 PB 甚至 EB 级别的大规模数据集。

  • 批处理应用: 适用于 MapReduce 等批处理框架,进行离线数据分析和处理。

  • 数据仓库: 作为数据仓库的基础存储,支撑数据分析和报表生成。

  • 日志存储和分析: 存储和分析大规模的日志数据。

HDFS 不适用场景:

  • 低延迟数据访问: 不适合需要毫秒级响应的在线事务处理 (OLTP) 应用。

  • 大量小文件存储: NameNode 内存资源有限,不适合存储大量小文件。

  • 随机数据写入: HDFS 优化了顺序写入,不适合频繁的随机写入操作。

2.2 HDFS 架构

HDFS 采用主从 (Master-Slave) 架构,由一个 NameNode (名称节点) 和多个 DataNode (数据节点) 组成。此外,通常还有一个 Secondary NameNode (辅助名称节点)Standby NameNode (备用名称节点) 用于辅助 NameNode 的管理。

主要组件职责:

  • NameNode (NN): HDFS 的核心,负责管理文件系统的命名空间 (Namespace) 和元数据 (Metadata)。

    • 命名空间管理: 维护文件和目录的树状结构,记录文件的路径、权限、所有者等信息。

    • 元数据管理: 维护文件块 (Blocks) 与 DataNode 的映射关系,记录每个文件块存储在哪些 DataNode 上。

    • 客户端请求处理: 接收客户端的元数据操作请求 (如创建文件、删除文件、获取文件列表等),并返回响应。

    • 数据块管理: 管理数据块的分配、复制、删除等操作,保证数据冗余和负载均衡。

    • 不存储实际数据: NameNode 只存储元数据信息,不存储实际的文件数据。

    • 内存密集型: 元数据存储在内存中,因此 NameNode 对内存要求较高。

    • 单点故障: 早期的 HDFS 版本中,NameNode 是单点故障,一旦 NameNode 宕机,整个 HDFS 集群将不可用。现代 HDFS 通常采用高可用 (HA) 方案来解决这个问题,例如使用 Standby NameNode。

  • DataNode (DN): 负责存储实际的数据块 (Blocks)。

    • 数据块存储: 将文件数据分割成块,并存储在本地磁盘上。

    • 数据块读写: 响应客户端和 NameNode 的数据块读写请求。

    • 数据块复制: 根据 NameNode 的指令,进行数据块的复制,保证数据冗余。

    • 心跳汇报: 定期向 NameNode 发送心跳信息,汇报自身状态和块信息。

    • 块报告: 定期向 NameNode 发送块报告,汇报自身存储的数据块列表。

    • 数据本地性支持: 提供数据本地性访问,将计算任务调度到数据所在的 DataNode 上执行。

  • Secondary NameNode (SNN) / Standby NameNode: 辅助 NameNode 管理,提高 HDFS 的可靠性和效率。

    • Secondary NameNode (较早版本):

      • Checkpointing: 定期从 NameNode 获取 EditLog 和 FSImage,合并成新的 FSImage,减少 NameNode 启动时加载 EditLog 的时间。

      • 冷备: 作为 NameNode 的冷备,在 NameNode 故障时可以用于恢复。但并非实时备份,数据可能存在丢失。

    • Standby NameNode (高可用 HA 方案):

      • 热备: 与 Active NameNode 实时同步 EditLog,保持元数据一致。

      • 故障切换: 在 Active NameNode 故障时,可以快速切换为 Active 状态,接管集群管理,实现高可用。

  • Client (客户端): 用户与 HDFS 交互的接口。

    • 文件操作: 提供 API 或命令行工具,允许用户进行文件上传、下载、创建目录、删除文件等操作。

    • 数据访问: 通过与 NameNode 和 DataNode 交互,实现数据的读取和写入。

2.3 HDFS 工作原理

2.3.1 数据写入流程 (Write Path)

  1. 客户端发起写请求: 客户端通过 HDFS 客户端 API 向 NameNode 发起写文件请求。

  2. NameNode 检查: NameNode 检查目标文件是否存在、客户端是否有权限等,如果检查通过,则返回允许写入的响应。

  3. NameNode 分配 Block ID 和 DataNode: NameNode 为文件分配 Block ID,并根据负载均衡策略选择一组 DataNode 用于存储数据块 (通常选择 Replication Factor 数量的 DataNode)。

  4. 客户端请求建立数据管道 (Pipeline): 客户端联系第一个 DataNode,请求建立数据管道。

  5. 建立数据管道: 第一个 DataNode 连接第二个 DataNode,第二个 DataNode 连接第三个 DataNode,以此类推,形成一个数据管道。

  6. 数据传输: 客户端将数据分成一个个数据包 (Packet),沿着数据管道依次发送给 DataNode。

  7. 数据包确认: 每个 DataNode 在接收到数据包后,会将其写入本地磁盘,并向前一个 DataNode 发送确认信息 (ACK)。

  8. 管道关闭和写入完成确认: 当客户端完成数据写入后,关闭数据管道,并向 NameNode 发送写入完成的确认信息。

  9. NameNode 更新元数据: NameNode 接收到写入完成的确认信息后,更新元数据信息,记录文件块与 DataNode 的映射关系。

关键点:

  • 数据管道 (Pipeline): 数据在 DataNode 之间以管道方式传输,提高了写入效率。

  • 数据包 (Packet): 数据被分割成数据包进行传输,方便数据校验和重传。

  • 数据冗余 (Replication): 数据块会被复制到多个 DataNode 上,保证数据可靠性。默认 Replication Factor 为 3。

2.3.2 数据读取流程 (Read Path)

  1. 客户端发起读请求: 客户端通过 HDFS 客户端 API 向 NameNode 发起读文件请求。

  2. NameNode 检查: NameNode 检查目标文件是否存在、客户端是否有权限等,如果检查通过,则返回文件块的元数据信息 (包括 Block ID 和 DataNode 列表)。

  3. 客户端选择 DataNode 并请求读取数据: 客户端根据就近原则 (数据本地性) 或负载均衡策略选择一个 DataNode,并向其发送数据读取请求。

  4. DataNode 读取数据并返回: DataNode 从本地磁盘读取数据块,并将数据返回给客户端。

关键点:

  • 数据本地性 (Data Locality): 客户端会尽量选择与自身位于同一机架或同一网络区域的 DataNode 读取数据,减少网络传输延迟,提高读取效率。

  • 并行读取: 客户端可以并行从多个 DataNode 读取数据块,提高整体读取吞吐量。

2.3.3 数据块 (Blocks)

  • 数据分割: HDFS 将文件分割成固定大小的数据块 (Blocks) 进行存储。默认 Block 大小为 128MB (Hadoop 2.x 及以上版本)。

  • 分布式存储单元: Block 是 HDFS 分布式存储的基本单元。

  • 冗余备份单元: Block 是数据冗余备份的基本单元。

  • 优点:

    • 简化存储管理: 简化了文件系统的存储管理,只需管理固定大小的 Block。

    • 提高数据冗余和容错性: 以 Block 为单位进行冗余备份,提高了数据可靠性。

    • 支持并行处理: 可以并行处理多个 Block,提高数据处理效率。

    • 数据本地性优化: 更容易实现数据本地性优化,将计算任务调度到存储 Block 的 DataNode 上。

2.3.4 数据冗余 (Replication)

  • 提高数据可靠性: HDFS 通过数据冗余备份机制来提高数据可靠性和容错性。

  • 默认 Replication Factor: 默认情况下,每个数据块会被复制三份 (Replication Factor = 3)。

  • 副本分布策略: 副本通常分布在不同的机架 (Rack) 上,以提高容错性。

    • 第一个副本通常存储在写入客户端所在的 DataNode 上 (如果该 DataNode 空间足够)。

    • 第二个副本存储在与第一个副本不同机架的 DataNode 上。

    • 第三个副本存储在与第一个和第二个副本相同机架的另一个 DataNode 上。

  • NameNode 管理副本: NameNode 负责管理数据块的副本,监控副本状态,并在副本数量不足时进行副本复制。

2.4 HDFS 常用操作 (代码实践)

HDFS 提供了丰富的命令行工具 (hdfs dfs) 和 Java API,方便用户进行文件操作和管理。

以下是一些常用的 HDFS 命令行操作示例:

1. 创建目录:

hdfs dfs -mkdir /user/hadoop/testdir
  • hdfs dfs: HDFS 命令行工具入口。

  • -mkdir: 创建目录命令。

  • /user/hadoop/testdir: 要创建的目录路径 (HDFS 路径)。

2. 上传文件到 HDFS:

hdfs dfs -put localfile.txt /user/hadoop/testdir/ hdfs dfs -copyFromLocal localfile.txt /user/hadoop/testdir/
  • -put-copyFromLocal: 从本地文件系统上传文件到 HDFS。

  • localfile.txt: 本地文件路径。

  • /user/hadoop/testdir/: HDFS 目标目录路径。

3. 从 HDFS 下载文件到本地:

hdfs dfs -get /user/hadoop/testdir/remotefile.txt localfile.txt hdfs dfs -copyToLocal /user/hadoop/testdir/remotefile.txt localfile.txt
  • -get-copyToLocal: 从 HDFS 下载文件到本地文件系统。

  • /user/hadoop/testdir/remotefile.txt: HDFS 文件路径。

  • localfile.txt: 本地目标文件路径。

4. 查看 HDFS 目录和文件列表:

hdfs dfs -ls /user/hadoop/testdir/ hdfs dfs -ls -R /user/hadoop/testdir/ # 递归查看子目录
  • -ls: 列出目录或文件信息。

  • -R: 递归选项,用于查看子目录。

5. 查看 HDFS 文件内容:

hdfs dfs -cat /user/hadoop/testdir/remotefile.txt hdfs dfs -tail /user/hadoop/testdir/remotefile.txt # 查看文件末尾内容 hdfs dfs -head /user/hadoop/testdir/remotefile.txt # 查看文件头部内容
  • -cat: 显示文件内容。

  • -tail: 显示文件末尾内容。

  • -head: 显示文件头部内容。

6. 删除 HDFS 文件或目录:

hdfs dfs -rm /user/hadoop/testdir/remotefile.txt # 删除文件 hdfs dfs -rmdir /user/hadoop/testdir/empty_dir # 删除空目录 hdfs dfs -rm -r /user/hadoop/testdir/non_empty_dir # 递归删除非空目录 hdfs dfs -rm -skipTrash /user/hadoop/testdir/file_to_delete # 跳过回收站直接删除文件
  • -rm: 删除文件。

  • -rmdir: 删除空目录。

  • -r: 递归选项,用于删除非空目录。

  • -skipTrash: 跳过回收站,直接删除。

7. 移动或重命名 HDFS 文件或目录:

hdfs dfs -mv /user/hadoop/testdir/oldname /user/hadoop/testdir/newname
  • -mv: 移动或重命名文件或目录。

8. 查看 HDFS 文件或目录大小:

hdfs dfs -du -h /user/hadoop/testdir/ # 以人类可读的方式显示目录大小 hdfs dfs -dus -h /user/hadoop/testdir/ # 显示目录下所有文件和目录的总大小
  • -du: 显示目录中每个文件和子目录的大小。

  • -dus: 显示目录下所有文件和目录的总大小。

  • -h: 以人类可读的方式显示大小 (如 KB, MB, GB)。

9. 修改文件权限:

hdfs dfs -chmod 755 /user/hadoop/testdir/remotefile.txt hdfs dfs -chown hadoop:hadoop /user/hadoop/testdir/remotefile.txt hdfs dfs -chgrp hadoop /user/hadoop/testdir/remotefile.txt
  • -chmod: 修改文件权限 (类似于 Linux 的 chmod 命令)。

  • -chown: 修改文件所有者 (类似于 Linux 的 chown 命令)。

  • -chgrp: 修改文件所属组 (类似于 Linux 的 chgrp 命令)。

10. 查看 HDFS 集群状态:

hdfs dfsadmin -report
  • hdfs dfsadmin: HDFS 管理员命令行工具入口。

  • -report: 显示 HDFS 集群状态报告,包括 NameNode 和 DataNode 信息、存储容量、块信息等。

更多 HDFS 命令和选项:

可以通过 hdfs dfs -helphdfs dfs -COMMAND -help 查看更多 HDFS 命令和选项的详细信息。


发布者: 作者: 转发
评论区 (0)
U