美文网首页
HDFS 架构

HDFS 架构

作者: wayyyy | 来源:发表于2022-10-30 21:10 被阅读0次

    HDFS是Hadoop生态下的分布式文件系统,基于Linux本地文件系统上的文件系统,它的特点是:

    1. 支持超大文件存储
    2. 流式数据访问
    3. 硬件故障的检测和快速应对
    4. 简单的一致性模型
    5. 不适合低延时数据访问、不适合大量小文件的存储、不适合并发写入、文件随机修改
    架构图
    架构图.png
    • 数据块
      HDFS 文件以数据块的形式存储,数据块是HDFS文件处理的最小单元,由于HDFS文件往往比较大,同时为了最小化寻址开销,所以HDFS数据块也更大,默认是128MB。HDFS 数据块会以文件的形式存储在数据节点的磁盘上。
      在 HDFS 中,所有文件都会被切分成若干个数据块分布在数据节点上存储。在HDFS 读和写的操作中,数据块都是最小的单元。在读操作中,HDFS 客户端会首先到名字节点查找HDFS包含的数据块位置信息,然后根据位置信息从数据节点读取数据。而在写操作中,HDFS客户端也会首先从名字节点申请新的数据块,然后根据申请的数据块位置信息建立数据流管道写数据。

    • NameNode
      NameNode 负责管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录,即元数据(MetaData)。元数据主要来说有两类:

      • 文件自身属性
        • 文件名称,权限,修改时间,文件大小,复制因子,数据块大小。
      • 文件块位置映射信息
        • 记录文件块和DataNode 之间的映射信息,即那个块位于哪个节点上。
    • DataNode
      数据节点,分布在廉价的计算机上,用于存储数据。
      DataNode 保存数据的基本单元是块(Block)通常是64M或者128M,写入后不能修改,但是可以追加。文件最终会被分成多个Block的方式保存在DataNode 上。


      image.png
    • Client
      客户端主要负责:

      1. 文件切分:文件上传HDFS的时候,Client 根据需求将文件切分成一个一个的块(Block),然后进行存储。
      2. 每个小数据块(Block)在其他服务器上都有副本,Client 会与NameNode进行通信,获取文件及其副本位置,为以后做打算。
      3. Client 与DataNode进行通信,读取或写入数据。
      4. 其他管理HDFS功能。
    数据安全
    • 多副本
      每一个文件可以配置副本数量,默认是3,副本的作用是防止因某个DataNode挂掉或磁盘损坏而导致数据丢失,除此之外块副本还可以提高块可读取的节点,提高 mapreduce 计算任务向数据移动的概率。

    • 放置策略
      因为同一个DataNode放置相同的块数据是没有意义的,所以NameNode不允许DataNode具有同一块的多个副本,即副本数量配置不能大于DataNode节点的数量。

      image.png

      并且NameNode可以获取每个DataNode所属的机架ID,块副本数量配置信息也是保存在NameNode中,所以块的副本放置策略是由NameNode决定好返回给客户端的。
      副本放置策略简单总结为:

      • 三分之一的副本位于写入器所在的节点上。
      • 三分之二的副本位于写入器所在的同一个机架上。
      • 其余三分之一则平均分布在其余机架上。
      Snipaste_2022-11-02_02-12-22.png

      如果副本数大于3个,则随机确定其它的副本位置。

    每个文件可以在写入时指定这个文件块的副本数量,也可以在未来修改某个文件的块副本数量,文件块的副本数量配置作为元数据的一部分保存在NameNode中。

    当修改某个文件的块副本数量时,NameNode将重新根据策略复制或减少块副本。当某个DataNode超过一定的时间(默认10分钟)没有上报心跳给NameNode,NameNode将认为该DataNode不可用,将不会分配块写入到这个DataNode中,原来分配在这个DataNode的块副本将会重新在其它可用的DataNode上复制。

    高可用

    没有Namenode,HDFS就不能工作。事实上,如果运行namenode的机器坏掉的话,系统中的文件将会完全丢失,因为没有其他方法能够将位于不同datanode上的文件块(blocks)重建文件。因此,namenode的容错机制非常重要,Hadoop提供了两种机制:

    • 第一种方式是将持久化存储在本地硬盘的文件系统元数据备份。Hadoop可以通过配置来让Namenode将他的持久化状态文件写到不同的文件系统中。这种写操作是同步并且是原子化的。比较常见的配置是在将持久化状态写到本地硬盘的同时,也写入到一个远程挂载的网络文件系统(NFS)。

    • 第二种方式是运行一个辅助的Namenode(SecondaryNamenode)。 事实上SecondaryNamenode主要作用是定期的将Namespace镜像与操作日志文件(edit log)合并,以防止操作日志文件(edit log)变得过大。通常,SecondaryNamenode 运行在一个单独的物理机上,因为合并操作需要占用大量的CPU时间以及和Namenode相当的内存。辅助Namenode保存着合并后的Namespace镜像的一个备份,万一哪天Namenode宕机了,这个备份就可以用上了。
      但是辅助Namenode总是落后于主Namenode,所以在Namenode宕机时,数据丢失是不可避免的。在这种情况下,一般的,要结合第一种方式中提到的远程挂载的网络文件系统(NFS)中的Namenode的元数据文件来使用,把NFS中的Namenode元数据文件,拷贝到辅助Namenode,并把辅助Namenode作为主Namenode来运行。

    一致性
    • 文件租约
      在hdfs中,不允许多个writer同时写同一个文件。那么hdfs是如何做到这一点的呢?
      文件租约,换句话说,租约是提供给客户端的写文件操作的临时许可证,无此许可证将不被允许操作此文件。
    文件写流程

    TODO

    文件读流程

    TODO

    相关文章

      网友评论

          本文标题:HDFS 架构

          本文链接:https://www.haomeiwen.com/subject/nzahtdtx.html