跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

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

HDFS 利用多副本机制保障数据可靠性,默认三副本策略兼顾读写性能与机架故障恢复。数据写入采用流水线复制,读取优先同机架节点。针对 NameNode 元数据损坏,结合远程备份与 SecondNameNode 进行恢复;DataNode 心跳检测失效节点并触发重复制;客户端校验块完整性确保数据准确。整体设计以廉价硬件为基础,通过软件层保障系统稳定性。

漫步发布于 2026/3/27更新于 2026/6/2325 浏览
分布式文件系统 HDFS 存储原理详解

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

HDFS 作为大数据生态的基石,其核心在于如何高效、可靠地管理海量数据。理解其存储机制,对于后续处理架构的学习至关重要。

一、数据的冗余存储

为了保证系统的容错性和可用性,HDFS 采用了多副本方式对数据进行冗余存储。通常一个数据块的多个副本会被分布到不同的数据节点上。如图所示,数据块 1 被分别存放到数据节点 A 和 C 上,数据块 2 被存放在数据节点 A 和 B 上等。

HDFS 数据块多副本存储

这种多副本策略主要有三个好处:

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

二、数据存取策略

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

(一)数据存放

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

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

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

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. 分布式文件系统 HDFS 存储原理
  2. 一、数据的冗余存储
  3. 二、数据存取策略
  4. (一)数据存放
  5. (二)数据读取
  6. (三)数据复制
  7. 三、数据错误与恢复
  8. (一)名称节点出错
  9. (二)数据节点出错
  10. (三)数据出错
  11. 小结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Qwen3-4B-Instruct 技术架构与 CPU 推理优化解析
  • Transformer 模型架构详解与核心组件解析
  • FPGA 中 RS485 收发器应用与毛刺处理方案
  • Windows 10/11 查看 MAC 地址的四种方法
  • FPGA 时钟约束详解:create_clock 与 create_generated_clock
  • llama.cpp Vulkan 后端编译指南:环境配置与问题修复
  • Java 部署:Jenkins Pipeline 自动化构建 Java 项目
  • Windows 部署 OpenAkita 并接入飞书实现本地 AI 助手
  • MyBatisPlus 与 Thymeleaf 全栈分页实战方案
  • Java 程序员必读:LeetCode 热门算法核心精讲
  • 亮数据 MCP 结合 Dify 构建自动化视频数据抓取与分析工作流
  • Android 陀螺仪开发实战:从传感器数据到角度积分
  • Flutter 使用 web_scraper 在 HarmonyOS 上实现网页抓取与数据解析
  • Dify 简介:低代码 AI 应用开发平台解析
  • 基于 KaiwuDB 与 CodeArts 智能体的智能家居本地化数据处理方案
  • C++ 计算思维综合实践 II 课程设计选题与验收标准
  • YOLO 模型 TensorRT C++ 推理实战指南
  • Java 中 Double 类型精度丢失原理与示例
  • Topaz Photo AI v1.3.3 技术解析:AI 降噪与无损放大实战
  • C/C++ 输入输出技巧与性能优化

相关免费在线工具

  • 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

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online