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

hdfs采用何种存储方式

HDFS采用分块存储方式,将大文件拆分为固定大小的数据块(默认128MB),每个数据块存储多个副本(默认3份)分布于不同节点,通过主从架构实现分布式

HDFS(Hadoop Distributed File System)作为大数据领域的核心存储系统,其存储方式设计围绕分布式、高容错、可扩展性等目标展开,以下从存储架构、数据组织、容错机制等维度详细解析其存储方式。


HDFS存储架构的核心特点

HDFS采用主从架构(Master-Slave),分为两类节点:

  1. NameNode(名称节点)

    • 负责管理文件系统的元数据(Metadata),如文件目录结构、块位置信息、权限等。
    • 元数据存储在内存中,并通过EditLog(操作日志)FsImage(检查点文件)实现持久化。
    • 单点故障风险较高,通常通过主备模式或HA(High Availability)架构缓解。
  2. DataNode(数据节点)

    • 负责存储实际的数据块(Block),并定期向NameNode发送心跳和块报告。
    • 数据以文件形式存储在本地磁盘,默认每个块大小为128MB(可配置)。
组件 职责
NameNode 管理元数据、协调客户端请求、维护文件与块的映射关系
DataNode 存储数据块、响应读写请求、执行块复制和删除操作
SecondaryNameNode 辅助NameNode合并EditLog和FsImage(非必需,HA模式下由JournalNode替代)

HDFS的数据存储方式

块存储(Block Storage)

  • 固定块大小:所有数据按固定大小(默认128MB)分割为块,即使文件小于块大小也会占用完整块。
  • 优势
    • 简化存储管理,避免小文件碎片化。
    • 大块更适合顺序读写,提升分布式环境下的IO效率。
  • 示例:一个500MB的文件会被拆分为4个块(128MB×3 + 16MB)。

数据副本机制(Replication)

  • 默认副本数:每个数据块存储3份副本(可配置),分布在不同机架或节点上。
  • 副本分配策略
    1. 第一个副本:随机选择第一个DataNode(通常靠近客户端)。
    2. 第二个副本:与第一个副本同机架的另一节点。
    3. 第三个副本:不同机架的节点,确保机架级容灾。
  • 作用
    • 数据高可用:任意两个副本所在节点故障仍可恢复数据。
    • 负载均衡:读请求可路由到最近副本,减少网络延迟。

元数据管理

  • 元数据存储结构
    • NameNode内存中维护fsimage(文件系统快照)和editlog(操作日志)。
    • fsimage记录文件目录树、块与文件的映射关系。
    • editlog记录新增/删除文件、块的操作,定期合并到fsimage
  • 元数据操作优化
    • 客户端缓存元数据,减少对NameNode的访问频率。
    • 支持增量更新,降低全量快照的开销。

HDFS的容错与恢复机制

数据块校验与恢复

  • 心跳机制:DataNode每3秒向NameNode发送心跳,包含块列表和存储容量。
  • 块丢失检测:若NameNode连续10.5秒未收到心跳,标记对应DataNode为失效状态。
  • 自动副本重建:NameNode根据策略(如副本数不足)触发新副本创建,优先选择存储空间充足的节点。

元数据持久化

  • EditLog与FsImage
    • editlog记录每次元数据变更操作(如文件创建、删除)。
    • fsimage是元数据的全量快照,定期(默认3600秒)将editlog合并到fsimage
  • 故障恢复:NameNode重启时,从fsimage加载元数据,并重放editlog恢复最新状态。

NameNode高可用(HA)

  • 双活模式:配置两个NameNode(Active和Standby),通过ZooKeeper协调状态切换。
  • 共享存储:使用JournalNode集群同步EditLog,确保主备节点数据一致。
  • 联邦架构(Federation):将元数据分散到多个NameNode,突破单点瓶颈。

HDFS与其他文件系统的对比

特性 HDFS 传统文件系统(如NTFS/EXT4) 对象存储(如S3)
存储模型 块(Block)+ 副本机制 文件层级结构 对象(Key-Value)
扩展性 横向扩展(添加DataNode) 纵向扩展(依赖单节点性能) 横向扩展(分区/桶)
数据一致性 最终一致性(异步复制) 强一致性 最终一致性
适用场景 大数据分析、批处理 单机或小集群应用 互联网应用、云存储

HDFS存储流程示例

写入流程

  1. 客户端请求NameNode创建文件,获取分配的DataNode列表。
  2. 按块大小将数据分片,逐块发送到DataNode。
  3. 第一个DataNode接收数据后,转发给后续副本节点,形成流水线(Pipeline)。
  4. NameNode记录块与文件的映射关系,DataNode定期上报存储状态。

读取流程

  1. 客户端向NameNode查询文件块位置。
  2. NameNode返回最近的副本节点列表。
  3. 客户端直接从DataNode读取数据块,支持多线程并行下载。

FAQs

问题1:HDFS的块大小为什么设置为128MB?能否调整?

解答

  • 默认128MB的原因
    • 平衡寻道时间与传输效率,大块减少NameNode元数据压力。
    • 适合MapReduce任务的输入分片(每个Task处理一个块)。
  • 可调性:可根据实际场景调整(如日志流式数据可设为64MB,视频文件可设为256MB)。

问题2:NameNode单点故障如何解决?

解答

  • HA(高可用)方案:部署主备NameNode,通过ZooKeeper监控状态,故障时自动切换。
  • 联邦架构:将元数据分片到多个NameNode,每个Namespace独立管理。
  • 持久化优化:缩短fsimage合并周期,减少故障恢复时间
0