这是我参与「第四届青训营 」笔记创作活动的第八天
HDFS特性
-
高性能
-
容错
-
相对简单的中心化管理
- 主/从架构(M/S)
-
安全
- 2种级别的安全可供选择
-
优化的分布式处理
- 数据本地性
-
可扩展性
HDFS 块
文件被添加到HDFS时,会被切分成块, 块大小默认128M
每个块被复制的次数,由复制因子决定,默认为3
NameNode
管理HDFS集群中文件系统的名字空间(Namespace),例如打开文件系统,关闭文件系统,重名名文件或者目录等
NameNode节点负责确定指定的文件块到具体的Datanode节点的映射关系,在客户端与数据段节点之间共享数据
管理DataNode节点的状态报告,包括Datanode节点的健康状态报告和其所在节点上数据块状态报告,以便能够及时处理失效的数据节点
Secondary NameNode
定时到NameNode去获取edit logs,并更新到fsimage上
一旦它有了新的fsimage文件,它将其拷贝回NameNode中
NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间
- 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删除多余的副本