HDFS 简析

简介

HDFS 全称 Hadoop Distributed File System,是用于 Hadoop 生态的底层分布式文件系统,其设计和 GFS 类似,但是做了一定的简化。HDFS 只允许写入一次,也就是写入必须是串行的,而 GFS 允许并行写入,同样也带来了更复杂的并行设计。

简化的 HDFS 仍然支持 GFS 的高容错和大规模数据,但是一次写入意味着不支持低延迟访问,也不适合小文件的存储(HDFS 一次写入一个块,通常是 64MB 或 128MB),另外也不允许对写入后的文件进行修改(一次写入的本质含义)。

设计

HDFS 的设计和 GFS 类似,都存在主从节点,只是命名不太一样,具体的设计就简单带过

  • NameNode(Master):接受客户端的请求,返回给客户端要获取数据的服务器地址,负责统筹全局的元数据
  • DataNode(Slave):实际存储数据的地方,执行数据块的读写操作,被 NameNode 管理
  • Secondary NameNode:主节点的备份,如果主节点挂了,次主节点就要顶上

读取操作流程

与 GFS 类似,假设没有错误发生的情况下:

  • 客户端向 NameNode 获取所需文件块所在所有的 DataNode 列表
  • 随后客户端向 DataNode 获取对应的数据块

此时读取即完毕,但假设有错误发生,例如 NameNode 宕机或客户端到 NameNode 的网络不可达,客户端会尝试下一个 DataNode 进行访问,如果所有 DataNode 都失效了,那么此时读取操作就失败了。

HDFS 并不保证读取操作一定成功

写入操作流程

GFS 为了支持并发写入,提出了租约和 Primary Chunk Server 的概念,管理起来复杂的多,而 HDFS 则非常简单。

  • 在写入前,客户端会向 NameNode 检查合法性,NameNode 返回是否可以上传
  • 确认可以上传之后,客户端对原始数据进行切分,以保证符合 HDFS 底层文件块的大小,随后请求第一个块应该储存到哪个 DataNode 上
  • NameNode 返回 DataNode 列表
  • 客户端向第一个 DataNode 上传数据,第一个 DataNode 会同步转发给下一个 DataNode,这部分设计和 GFS 类似,充分了利用网络带宽
  • 第一个块完成写入后,随后再次请求第二个块的写入,再次询问 NameNode 应该写入到哪个 DataNode 中

所有块传输完成后,DataNode 会向 NameNode 发送信号,所有写入得到确认后,NameNode 返回客户端写入成功

假设写入时某个 DataNode 故障,则会跳过,后续 NameNode 会组织新的 DataNode 来替代这个故障的 DataNode

容错机制

分布式文件系统可能发生的错误主要有几点:

  • 节点故障:DataNode 会定期向 NameNode 发送心跳信息,如果 NameNode 一段时间没有收到该 DataNode 的心跳信息,则会认为该节点挂了,从而将节点管理的数据再复制一份分发到其他节点上
  • 通讯故障:实际上和节点故障是一样的,不再赘述
  • 数据损坏:例如硬盘损坏,表现为一个块中的校验和和数据对不上,在 DataNode 定期发送的心跳消息中,会报告自己所存储数据的元数据,如果存在错误的数据块,NameNode 则会组织该块的复制,具体来说就是让 DataNode 去另一个可用的 DataNode 上获取数据

Reference

[1] https://blog.csdn.net/leftfist/article/details/104168141

下一篇

评论 | 0条评论