跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

分布式文件系统 HDFS 存储原理

综述由AI生成HDFS 采用多副本冗余存储机制保障容错性与可用性,默认副本数为 3。数据存放基于机架策略,优先同机架内写入与读取以提升带宽效率。数据复制采用流水线方式提高写入性能。针对名称节点、数据节点及数据本身错误,HDFS 设计了心跳检测、元数据备份、客户端校验等恢复机制,确保系统稳定运行。

魔法巫师发布于 2026/3/24更新于 2026/4/308 浏览
分布式文件系统 HDFS 存储原理

一、数据的冗余存储

作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS 采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。图 1 展示了 HDFS 数据块的多副本存储情况。

图 1 HDFS 数据块多副本存储

这种多副本方式具有以下 3 个优点。

  1. 加快数据传输速度。当多个客户端需要同时访问同一个文件时,可以让各个客户端分别从不同的数据块副本中读取数据,这就大大加快了数据传输速度。
  2. 容易检查数据错误。HDFS 的数据节点之间通过网络传输数据,采用多个副本可以很容易判断数据传输是否出错。
  3. 保证数据的可靠性。即使某个数据节点出现故障失效,也不会造成数据丢失。

二、数据存取策略

数据存取策略包括数据存放、数据读取和数据复制等方面,它在很大程度上会影响到整个分布式文件系统的读写性能,是分布式文件系统的核心内容。

(一)数据存放

为了提高数据的可靠性与系统的可用性,以及充分利用网络带宽,HDFS 采用了以机架(Rack)为基础的数据存放策略。一个 HDFS 集群通常包含多个机架,不同机架之间的数据通信需要经过交换机或者路由器,同一个机架中不同机器之间的通信则不需要经过交换机和路由器,这意味着同一个机架中不同机器之间的通信要比不同机架之间机器的通信带宽大。

HDFS 默认每个数据节点都在不同的机架上,这种方法会存在一个缺点,那就是写入数据的时候不能充分利用同一机架内部机器之间的带宽。但是,与这个缺点相比,这种方法也带来了更多很显著的优点:首先,可以获得很高的数据可靠性,即使一个机架发生故障,位于其他机架上的数据副本仍然是可用的;其次,可以在多个机架上并行读取数据,大大提高数据读取速度;最后,可以更容易地实现系统内部负载均衡和错误处理。

HDFS 默认的冗余复制因子是 3,每一个文件块会被同时保存到 3 个地方,其中,有两个副本放在同一个机架的不同机器上面,第 3 个副本放在不同机架的机器上面,这样既可以保证机架发生异常时的数据恢复,也可以提高数据读写性能。一般而言,HDFS 副本的放置策略如下。

  1. 如果是在集群内发起写操作请求,则把第 1 个副本放置在发起写操作请求的数据节点上,实现就近写入数据。如果是在集群外发起写操作请求,则从集群内部挑选一台磁盘空间较为充足、CPU 不太忙的数据节点,作为第 1 个副本的存放地。
  2. 第 2 个副本会被放置在与第 1 个副本不同的机架的数据节点上。
  3. 第 3 个副本会被放置在与第 1 个副本相同的机架的其他节点上。
  4. 如果还有更多的副本,则继续从集群中随机选择数据节点进行存放。

(二)数据读取

HDFS 提供了一个 API 可以确定一个数据节点所属的机架 ID,客户端也可以调用 API 获取自己所属的机架 ID。当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用 API 来确定客户端和这些数据节点所属的机架 ID。当发现某个数据块副本对应的机架 ID 和客户端对应的机架 ID 相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。

(三)数据复制

HDFS 的数据复制采用了流水线复制的策略,大大提高了数据复制过程的效率。当客户端要往 HDFS 中写入一个文件时,这个文件会首先被写入本地,并被切分成若干个块,每个块的大小是由 HDFS 的设定值来决定的。每个块都向 HDFS 集群中的名称节点发起写请求,名称节点会根据系统中各个数据节点的使用情况,选择一个数据节点列表返回给客户端,然后客户端就把数据首先写入列表中的第 1 个数据节点,同时把列表传给第 1 个数据节点,当第 1 个数据节点接收到 4 KB 数据的时候,写入本地,并且向列表中的第 2 个数据节点发起连接请求,把自己已经接收到的 4 KB 数据和列表传给第 2 个数据节点。当第 2 个数据节点接收到 4 KB 数据的时候,写入本地,并且向列表中的第 3 个数据节点发起连接请求,依此类推,列表中的多个数据节点形成一条数据复制的流水线。最后,当文件写完的时候,数据复制也同时完成。

三、数据错误与恢复

HDFS 具有较高的容错性,可以兼容廉价的硬件设备,它把硬件出错看成一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下 3 种情形。

(一)名称节点出错

名称节点保存了所有的元数据信息,其中最核心的两大文件是 FsImage 和 EditLog,如果这两个文件发生损坏,那么整个 HDFS 实例将失效。Hadoop 采用两种机制来确保名称节点的安全:一是把名称节点上的元数据信息同步存储到其他文件系统,比如远程挂载的网络文件系统(Network File System,NFS)中;二是运行一个第二名称节点,当名称节点死机以后,可以把运行第二名称节点作为一种弥补措施,利用第二名称节点中的元数据信息进行系统恢复,但是从前面对第二名称节点的介绍中可以看出,这样做仍然会丢失部分数据。因此,一般会把上述两种方式结合使用,当名称节点发生死机时,首先到远程挂载的网络文件系统中获取备份的元数据信息,放到第二名称节点上进行恢复,并把第二名称节点作为名称节点来使用。

(二)数据节点出错

每个数据节点会定期向名称节点发送心跳信息,向名称节点报告自己的状态。当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时这些数据节点就会被标记为死机,节点上面的所有数据都会被标记为不可读,名称节点也不会再给它们发送任何 I/O 请求。这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子。名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。HDFS 与其他分布式文件系统的最大区别就是可以调整冗余数据的位置。

(三)数据出错

网络传输和磁盘错误等因素都会造成数据错误。客户端在读取数据后,会采用 MD5 和 SHA-1 对数据块进行校验,以确定读取正确的数据。在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入同一个路径的隐藏文件里面。当客户端读取文件的时候,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验。如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块。

小结

HDFS 采用多副本冗余存储,能加快传输、便于查错、保证可靠性。数据存取策略上,以机架为基础存放数据,读取时优先选同机架副本,复制采用流水线策略。在数据错误与恢复方面,针对名称节点出错,采用同步存储和第二名称节点结合恢复;数据节点出错则启动冗余复制;数据出错时客户端校验,出错则换节点读取并报告名称节点重新复制,确保系统稳定运行。

目录

  1. 一、数据的冗余存储
  2. 二、数据存取策略
  3. (一)数据存放
  4. (二)数据读取
  5. (三)数据复制
  6. 三、数据错误与恢复
  7. (一)名称节点出错
  8. (二)数据节点出错
  9. (三)数据出错
  10. 小结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前缀和算法原理与应用:一维与二维区间求和优化
  • 五种精确身份证号匹配算法设计与实现
  • SpringBoot 创建首个项目与 Spring Web MVC 入门
  • DataRoom 开源大屏设计器:基于 SpringBoot 快速构建数据可视化平台
  • RCTF 2025 Web 部分解题思路与漏洞分析
  • 使用 OpenClaw 与飞书搭建专属 AI 机器人
  • 人工智能大模型学习路线:从入门到进阶的完整指南
  • Llama-3.2V-11B-COT 模型视觉推理质量评估指南
  • Web 自动化测试实战:Selenium 常用函数全解析与场景化应用指南
  • VS Code 禁用 GitHub Copilot 代码自动补全
  • DEIM 实时目标检测算法与 Visdrone2019 数据集实战
  • 北漂转行软件测试:从零开始的外企高薪实战指南
  • 无线联邦学习:隐私保护下的 AI 协同进化
  • OpenClaw 在 Mac 上本地化部署及接入飞书教程
  • 无人机低空智能巡飞巡检平台:全域感知与智能决策
  • 华为 HCIP-AI Solution Architect H13-323 认证试题解析与知识点总结
  • VS Code 内置聊天与 GitHub Copilot Chat 区别及中文设置
  • 卷积神经网络(CNN)进阶:经典架构解析与实战开发
  • Python AI Agent 智能体构建指南:从原理到实战
  • PyTorch 实战:基于文本引导的图像生成与 Stable Diffusion 实践

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online