当前位置:首页 > 行业动态 > 正文

hadoop中的数据存储

Hadoop采用HDFS分布式存储,数据分块(默认128MB)多副本(通常3份)存储于不同节点,由NameNode管理元数据,DataNode存储实际数据

Hadoop中的数据存储详解

Hadoop作为分布式计算框架的核心优势之一在于其高效的数据存储系统——HDFS(Hadoop Distributed File System),HDFS通过分布式架构、数据分块存储和冗余备份机制,解决了传统文件系统在海量数据处理中的瓶颈问题,以下从架构设计、存储原理、数据读写流程、容错机制等多个维度展开分析。


HDFS架构与数据存储核心组件

HDFS采用主从架构,核心组件包括:

  • NameNode:负责管理文件系统的元数据(如文件目录结构、块位置信息),类似于传统文件系统的目录索引。
  • DataNode:实际存储数据的节点,负责执行NameNode的指令(如创建/删除块、复制数据)。
  • Secondary NameNode:辅助NameNode进行元数据checkpoint,缓解内存压力(注:Hadoop 3.x后已被CheckpointNode替代)。

关键特性
| 特性 | 说明 |
|——————|————————————————————————–|
| 主从架构 | NameNode集中管理元数据,DataNode分散存储数据块,避免单点存储压力 |
| 数据分块存储 | 文件被拆分为固定大小的数据块(默认128MB),独立存储并冗余 |
| 冗余备份 | 每个数据块默认存储3份副本,分布在不同机架/节点上,保证高可用性 |
| 一次写入多次读取 | 数据写入后不可修改,适合流式数据处理场景 |


数据存储的物理结构

  1. 数据块(Block)

    • HDFS将文件划分为固定大小的数据块(Block),默认128MB(可配置)。
    • 每个Block被分配唯一的Block ID,并在多个DataNode上存储副本。
    • 示例:一个500MB的文件会被拆分为4个Block(128MB×3 + 14MB×1)。
  2. 元数据管理

    • NameNode通过内存中的FSImage(文件系统镜像)和EditLog(操作日志)记录元数据。
    • Inode表:记录文件/目录的层级关系及对应的Block列表。
    • Block映射表:记录每个Block的存储位置(DataNode地址)。
  3. 存储格式

    hadoop中的数据存储  第1张

    • 数据以二进制形式存储,支持流式访问,无数据随机修改能力。
    • 文件元数据(如所有者、权限)存储在NameNode,数据块内容存储在DataNode。

数据写入流程

  1. 客户端请求

    客户端向NameNode发起文件写入请求,NameNode检查文件是否存在并返回可用Block ID。

  2. 数据分块与复制
    • 文件被拆分为多个Block,每个Block通过Pipeline机制依次写入多个DataNode。
    • 副本分配策略
      • 第一个副本存储在客户端所在机架的某个DataNode。
      • 第二个副本存储在同一机架的另一个DataNode。
      • 第三个副本存储在不同机架的DataNode(机架感知策略)。
  3. ACK确认与流水线关闭
    • 所有副本写入成功后,DataNode向NameNode发送确认,Pipeline关闭。
    • NameNode更新元数据,记录Block的位置信息。

写入流程示意图

客户端 → NameNode(分配Block ID) → DataNode1 → DataNode2 → DataNode3(副本写入)

数据读取流程

  1. 元数据查询

    客户端向NameNode请求文件的Block位置信息,获取Block ID及DataNode地址列表。

  2. 直接读取DataNode
    • 客户端根据Block列表,直接从最近的DataNode读取数据(跳过NameNode)。
    • 数据本地性优化:优先读取本机或同机架的副本,减少网络传输开销。

读取流程特点

  • NameNode仅提供元数据,不参与数据传输,降低负载。
  • 支持多客户端并行读取,提升吞吐量。

容错与高可用机制

  1. 数据冗余

    • 每个Block存储多份副本(默认3份),任意两份副本可用即可恢复数据。
    • 副本存储策略
      • 机架内副本:提升写入效率。
      • 跨机架副本:防止机架级故障导致数据丢失。
  2. 坏块检测与恢复

    • DataNode定期向NameNode发送心跳包,报告存储状态。
    • 若检测到Block损坏,NameNode触发副本重建流程,从其他副本恢复数据。
  3. NameNode高可用

    • Active+Standby模式:两台NameNode互为热备,通过ZooKeeper协调切换。
    • JournalNode:共享日志存储,确保元数据一致性。

存储效率优化

  1. 数据压缩

    • 支持多种压缩算法(如Snappy、Gzip),减少存储空间占用。
    • 压缩比对比
      | 算法 | 压缩比 | CPU开销 |
      |———|——–|———-|
      | Snappy | 中 | 低 |
      | Gzip | 高 | 高 |
  2. 小文件合并

    • Hadoop通过Hadoop Archive(HAR)CombineFileInputFormat将小文件合并为大Block,减少NameNode内存压力。
  3. 存储分层(HDFS TieredStorage)

    支持冷热数据分离,将高频访问数据存储在SSD,低频数据存储在HDD。


HDFS vs. 其他存储系统

对比项 HDFS 传统分布式文件系统(如NFS) NoSQL数据库(如HBase)
数据模型 一次写入、多次读取 可修改 随机读写
扩展性 水平扩展(添加DataNode) 垂直扩展 水平扩展
适用场景 批处理、大数据分析 小规模文件共享 实时查询与更新

FAQs

Q1:HDFS的Block大小为什么是128MB(或64MB)?
A1:

  • 减少寻址开销:大块减少NameNode管理的Block数量,降低内存消耗。
  • 优化磁盘IO:大块更适合连续读写,减少磁盘寻道时间。
  • 网络传输效率:大块可充分利用网络带宽,减少传输次数。

Q2:如果某个DataNode故障,HDFS如何保证数据不丢失?
A2:

  • 副本自动恢复:NameNode检测到故障后,触发其他副本的复制流程。
  • 机架感知策略:副本分布在不同机架,避免单点故障影响所有副本。
  • 心跳机制:DataNode定期向NameNode发送心跳,快速识别故障
0