第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System) 第二章:Hadoop 分布式文件系统 HDFS (Hadoop Distributed File System) 2.1 HDFS 概述 随着数据爆炸式增长,传统的文件系统在存储和处理大规模数据集时面临诸多挑战: 存储容量限制: 单机存储容量有限,无法满足海量数据存储需求。 数据可靠性: 单点故障风险高,数据容易丢失。 数据访问效率: 单机处理能力有限,难以支撑高并发、高吞吐量的数据访问。 HDFS 正是为了解决这些挑战而诞生的。它是一个分布式、可扩展、高容错的文件系统,专为存储和处理大规模数据集而设计。
随着数据爆炸式增长,传统的文件系统在存储和处理大规模数据集时面临诸多挑战:
存储容量限制: 单机存储容量有限,无法满足海量数据存储需求。
数据可靠性: 单点故障风险高,数据容易丢失。
数据访问效率: 单机处理能力有限,难以支撑高并发、高吞吐量的数据访问。
HDFS 正是为了解决这些挑战而诞生的。它是一个分布式、可扩展、高容错的文件系统,专为存储和处理大规模数据集而设计。
HDFS 的关键特性:
分布式存储: 数据被分割成块 (Blocks) 分布存储在集群中的多台计算机上,突破了单机存储容量的限制。
高容错性: 通过数据冗余备份 (Replication) 机制,即使部分节点发生故障,数据仍然安全可靠。
高吞吐量: 针对大数据批量访问模式进行优化,提供高吞吐量的数据读写能力。
流式数据访问: 支持一次写入、多次读取的访问模式,适合批处理应用。
数据本地性: 将计算任务调度到数据存储节点附近执行,减少数据传输开销,提高计算效率。
可扩展性: 可以方便地通过增加节点来扩展存储容量和处理能力。
HDFS 适用场景:
海量数据存储: 存储 PB 甚至 EB 级别的大规模数据集。
批处理应用: 适用于 MapReduce 等批处理框架,进行离线数据分析和处理。
数据仓库: 作为数据仓库的基础存储,支撑数据分析和报表生成。
日志存储和分析: 存储和分析大规模的日志数据。
HDFS 不适用场景:
低延迟数据访问: 不适合需要毫秒级响应的在线事务处理 (OLTP) 应用。
大量小文件存储: NameNode 内存资源有限,不适合存储大量小文件。
随机数据写入: 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 交互,实现数据的读取和写入。
客户端发起写请求: 客户端通过 HDFS 客户端 API 向 NameNode 发起写文件请求。
NameNode 检查: NameNode 检查目标文件是否存在、客户端是否有权限等,如果检查通过,则返回允许写入的响应。
NameNode 分配 Block ID 和 DataNode: NameNode 为文件分配 Block ID,并根据负载均衡策略选择一组 DataNode 用于存储数据块 (通常选择 Replication Factor 数量的 DataNode)。
客户端请求建立数据管道 (Pipeline): 客户端联系第一个 DataNode,请求建立数据管道。
建立数据管道: 第一个 DataNode 连接第二个 DataNode,第二个 DataNode 连接第三个 DataNode,以此类推,形成一个数据管道。
数据传输: 客户端将数据分成一个个数据包 (Packet),沿着数据管道依次发送给 DataNode。
数据包确认: 每个 DataNode 在接收到数据包后,会将其写入本地磁盘,并向前一个 DataNode 发送确认信息 (ACK)。
管道关闭和写入完成确认: 当客户端完成数据写入后,关闭数据管道,并向 NameNode 发送写入完成的确认信息。
NameNode 更新元数据: NameNode 接收到写入完成的确认信息后,更新元数据信息,记录文件块与 DataNode 的映射关系。
关键点:
数据管道 (Pipeline): 数据在 DataNode 之间以管道方式传输,提高了写入效率。
数据包 (Packet): 数据被分割成数据包进行传输,方便数据校验和重传。
数据冗余 (Replication): 数据块会被复制到多个 DataNode 上,保证数据可靠性。默认 Replication Factor 为 3。
客户端发起读请求: 客户端通过 HDFS 客户端 API 向 NameNode 发起读文件请求。
NameNode 检查: NameNode 检查目标文件是否存在、客户端是否有权限等,如果检查通过,则返回文件块的元数据信息 (包括 Block ID 和 DataNode 列表)。
客户端选择 DataNode 并请求读取数据: 客户端根据就近原则 (数据本地性) 或负载均衡策略选择一个 DataNode,并向其发送数据读取请求。
DataNode 读取数据并返回: DataNode 从本地磁盘读取数据块,并将数据返回给客户端。
关键点:
数据本地性 (Data Locality): 客户端会尽量选择与自身位于同一机架或同一网络区域的 DataNode 读取数据,减少网络传输延迟,提高读取效率。
并行读取: 客户端可以并行从多个 DataNode 读取数据块,提高整体读取吞吐量。
数据分割: HDFS 将文件分割成固定大小的数据块 (Blocks) 进行存储。默认 Block 大小为 128MB (Hadoop 2.x 及以上版本)。
分布式存储单元: Block 是 HDFS 分布式存储的基本单元。
冗余备份单元: Block 是数据冗余备份的基本单元。
优点:
简化存储管理: 简化了文件系统的存储管理,只需管理固定大小的 Block。
提高数据冗余和容错性: 以 Block 为单位进行冗余备份,提高了数据可靠性。
支持并行处理: 可以并行处理多个 Block,提高数据处理效率。
数据本地性优化: 更容易实现数据本地性优化,将计算任务调度到存储 Block 的 DataNode 上。
提高数据可靠性: HDFS 通过数据冗余备份机制来提高数据可靠性和容错性。
默认 Replication Factor: 默认情况下,每个数据块会被复制三份 (Replication Factor = 3)。
副本分布策略: 副本通常分布在不同的机架 (Rack) 上,以提高容错性。
第一个副本通常存储在写入客户端所在的 DataNode 上 (如果该 DataNode 空间足够)。
第二个副本存储在与第一个副本不同机架的 DataNode 上。
第三个副本存储在与第一个和第二个副本相同机架的另一个 DataNode 上。
NameNode 管理副本: NameNode 负责管理数据块的副本,监控副本状态,并在副本数量不足时进行副本复制。
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 -help 或 hdfs dfs -COMMAND -help 查看更多 HDFS 命令和选项的详细信息。