基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

讲讲HDFS的整体架构,它包含哪些核心组件?

知识点图片

HDFS(Hadoop Distributed File System)是Hadoop生态系统中的核心组件之一,主要用于解决海量数据的分布式存储问题。它的设计初衷是运行在廉价的商用硬件上,提供高吞吐量的数据访问,非常适合处理超大文件。

HDFS 采用的是经典的 Master/Slave(主从)架构

下面为您详细拆解HDFS的整体架构及其核心组件:


一、 HDFS 的核心组件

HDFS 的架构主要由以下五个核心部分组成:

1. NameNode (名称节点 —— “大管家” / Master)

NameNode 是整个HDFS集群的核心,负责管理文件系统的元数据(Metadata)

  • 管理命名空间(Namespace): 维护着文件系统的目录树以及所有文件和目录的层级关系。
  • 管理映射信息: 记录着“文件被切分成了哪些数据块(Block)”,以及“这些数据块分别存放在哪些 DataNode 上”。
  • 内存运行: 为了保证极快的响应速度,NameNode 会将所有元数据加载到内存中。
  • 核心文件:
    • fsimage:元数据的镜像文件(相当于某个时刻文件系统的快照)。
    • edits:编辑日志文件(记录对文件系统的所有修改操作,如创建、删除文件等)。
  • 注意:NameNode 不存储实际的业务数据,只存储“数据在哪里”的目录信息。

2. DataNode (数据节点 —— “打工人” / Slave)

DataNode 是实际存储数据的节点,通常有多个,分布在不同的物理机器上。

  • 存储数据块(Block): 负责将客户端发送来的数据块以文件的形式保存在本地磁盘上。
  • 执行读写: 根据客户端或 NameNode 的调度,执行真正的数据读取和写入操作。
  • 心跳机制(Heartbeat): DataNode 会定期(默认3秒)向 NameNode 发送心跳包,汇报自己的存活状态。
  • 块汇报(Block Report): DataNode 启动时以及运行期间,会定期向 NameNode 汇报自己节点上存储的所有数据块信息,以便 NameNode 掌握全局数据分布。

3. Secondary NameNode (第二名称节点 —— “秘书”)

这是一个经常被误解的组件,它*不是 NameNode 的热备(Backup)!*

  • 核心职责: 它的主要工作是定期合并 fsimageedits 日志
  • 为什么需要它: 如果 NameNode 长期运行,edits 日志会变得非常大,导致 NameNode 重启时恢复数据极慢。Secondary NameNode 会定期将这两个文件拉取过来进行合并,生成新的 fsimage,再推回给 NameNode,从而减小 NameNode 的压力,加快集群重启速度。
  • (注:在 Hadoop 2.x 以后的高可用 HA 架构中,Secondary NameNode 的作用基本被 Standby NameNode 取代。)

4. Block (数据块 —— 存储的基本单位)

虽然它不是一个具体的进程组件,但它是 HDFS 架构中最核心的逻辑概念

  • 文件切分: HDFS 不会把大文件作为一个整体存储,而是切分成大小相等的 Block(默认大小在 Hadoop 2.x/3.x 中是 128MB)。
  • 多副本机制(Replication): 为了保证数据不丢失(容错性),每个 Block 默认会被复制 3 份,分别存放在不同的 DataNode 上(通常跨机架存储以防机架断电)。

5. Client (客户端)

Client 是用户与 HDFS 交互的入口。

  • 切分文件: 上传文件时,Client 会先将文件切分成一个个 Block。
  • 交互协调: 读写数据时,Client 会先找 NameNode 获取元数据(比如文件存放在哪里),然后直接与 DataNode 通信进行实际的数据传输。
  • (重要设计:数据传输直接在 Client 和 DataNode 之间进行,不经过 NameNode,这避免了 NameNode 成为网络瓶颈。)

二、 组件之间是如何协同工作的?(以读写流程为例)

为了更好地理解架构,我们看看这些组件是如何配合的:

📝 写数据流程 (Write)

  1. Client 请求 NameNode:我要上传一个文件 test.txt
  2. NameNode 检查权限和目录后,回复:可以上传。
  3. Client 请求第一个 Block 该放到哪?
  4. NameNode 返回 3 个 DataNode 的地址(假设为 A, B, C)。
  5. Client 与 DataNode A 建立连接,A 连接 B,B 连接 C,形成一个数据管道(Pipeline)
  6. Client 将数据边切分成小包(Packet),边发送给 A;A 存一份后传给 B;B 存一份传给 C。
  7. 完成后,DataNodeNameNode 汇报,Client 申请传输下一个 Block。

📖 读数据流程 (Read)

  1. Client 请求 NameNode:我要读取 test.txt
  2. NameNode 将该文件所有 Block 所在的 DataNode 地址列表返回给 Client(会根据网络拓扑结构,把距离 Client 最近的节点排在前面)。
  3. Client 并发地连接这些最近的 DataNode,直接从中下载数据。
  4. Client 将下载到的 Block 拼接回完整的文件。

三、 现代 HDFS 的架构演进 (Hadoop 2.x/3.x)

在早期的 Hadoop 1.x 中,只有一个 NameNode,存在单点故障(SPOF)问题。如果 NameNode 挂了,整个集群就瘫痪了。为了解决这个问题,现代 HDFS 引入了:

  1. High Availability (HA - 高可用架构):
    配置两个 NameNode:一个处于 Active(活跃) 状态,另一个处于 Standby(待机) 状态。它们通过一组称为 JournalNodes 的独立节点来实时同步 edits 日志。如果 Active 节点宕机,Standby 节点能迅速接管,实现无缝切换。
  2. Federation (联邦机制):
    如果集群规模超级大,一个 NameNode 的内存装不下所有的元数据怎么办?联邦机制允许存在多个独立的 NameNode,它们分别管理文件系统的不同目录(比如 NN1 管理 /user,NN2 管理 /log),底层的 DataNode 则是共享的,从而实现水平扩展。

总结

HDFS 的架构精髓在于:NameNode 统管全局元数据(脑力劳动),DataNode 分散存储物理数据(体力劳动),Client 居中协调并与 DataNode 直接发生数据交换。 这种设计加上 Block 的多副本机制,完美实现了海量数据下的高吞吐、高容错与可扩展。

00:00
00:00