HDFS原理与应用 | 青训营笔记

60 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第八天

HDFS特性

  • 高性能

  • 容错

  • 相对简单的中心化管理

    • 主/从架构(M/S)
  • 安全

    • 2种级别的安全可供选择
  • 优化的分布式处理

    • 数据本地性
  • 可扩展性

HDFS 块

文件被添加到HDFS时,会被切分成块, 块大小默认128M
每个块被复制的次数,由复制因子决定,默认为3

image.png

NameNode

管理HDFS集群中文件系统的名字空间(Namespace),例如打开文件系统,关闭文件系统,重名名文件或者目录等

NameNode节点负责确定指定的文件块到具体的Datanode节点的映射关系,在客户端与数据段节点之间共享数据

管理DataNode节点的状态报告,包括Datanode节点的健康状态报告和其所在节点上数据块状态报告,以便能够及时处理失效的数据节点

Secondary NameNode

定时到NameNode去获取edit logs,并更新到fsimage上
一旦它有了新的fsimage文件,它将其拷贝回NameNode中
NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间

image.png

  • fsimage - 它是在NameNode启动时对整个文件系统的快照
  • edit logs - 它是在NameNode启动后,对文件系统的改动序列

SecondaryNameNode 诞生来源

只有 NameNode 重启时 ,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大.

在这种情况下就会出现下面一些问题:

edit logs文件会变的很大 NameNode的重启会花费很长时间,因为有很多改动(edit logs中)要合并到fsimage文件上 如果NameNode挂掉了,那我们就丢失了很多改动因为此时的fsimage文件非常旧

所以为了克服这个问题,我们需要一个易于管理的机制来帮助我们减小edit logs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力

DataNode

  • 文件的实际内容是存储在工作节点的“块”里

  • 每个工作节点都运行一个DataNode守护进程

    • 控制块的访问
    • 与NameNode保持通信
  • 这些块是工作节点本地文件系统里的一些简单的文件

  • 每个块为了冗余,都存储在多个不同的节点上

处理数据损坏

客户端读数据时会检查校验和, 读块现场算的校验和会与块创建时的校验和进行比较

如果两者校验和不同,客户端则从列表里的下一个DataNode里读取数据

  • 会通知NameNode,发现了该块的一个损坏的副本
  • NameNode将在其他地方重新复制一份该块

DataNode会定期检查块的校验和,可避免位衰减带来块损坏

数据的可靠性及恢复

DataNode往NameNode发送心跳, NameNode一段时间内没有收到任何心跳,就认为该DataNode丢失了

  • NameNode确定该丢失节点上有哪些块
  • NameNode到其他DataNode上去找这些块的副本
    • 并将该副本复制到其他节点上
  • 以此来保持3个可用的副本

丢失的DataNode隔断时间后,可以重新加入集群,为确保块不超副本数复制,NameNode会让DataNode删除多余的副本