这是我参与「第四届青训营 」笔记创作活动的第11天
本次笔记重点内容
- HDFS 架构
- HDFS 设计与异常处理
- HDFS应用场景
HDFS——Hadoop Distributed File System
HDFS是一个分布式的文件系统,可以自动处理、规避多种错误场景;数据多副本提高容错;服务端支持海量client并发读写;成本低,无需高端定制硬件设备。
架构原理
云数据节点 NameNode
大数据框架都是分布式的,可能每个角色都运行在各个不同的服务器上面,需要进行通信的时候就要需要网络的支持,而在我们客户端需要读一个文件的信息时,必须知道我们这个文件被分成了多少个block,各个block又分别存储在哪个服务器上,这种用于描述文件的信息被称为文件的元数据信息(metaData),而metaData就是存储在NameNode的内存中的。它维护目录树的增删改查操作,维护文件和数据块的关系,维护文件块存放节点信息,分配新文件存放节点
数据节点 DataNode
数据卡存放,确定节点处于正常存活状态,副本复制
客户端 Client
实现了数据读写的容错等较为复杂的逻辑
心跳机制
心跳机制解决了HDFS集群间的通信问题,还是NameNode命令DataNode执行操作的途径。用3秒作为频率,若超过秒数过多还没收到心跳,如某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上。
从client(某台机器)访问HDFS,程序通过SDK访问HDFS,NameNode很少,是最复杂的中枢节点,对元数据进行管理,无论写还是读数据,都要通过NameNode获取准确位置等信息,用户数据则全部存在DataNode的硬盘上,DataNode数量很多。
写流程
读流程
关键设计
NameNode目录树的维护
蓝色的是目录,绿色的是文件。完整的数据结构会存放在fsimage的内存中,它会定期的存入硬盘,修改是只会修改内存中的目录树。如果节点没了之后,因为修改没有实时保存到硬盘上而导致里面的数据丢失怎么办?EditLog是目录树的修改日志,会实时刷入硬盘,可以通过它去恢复完整的目录树。
NameNode数据放置——数据分散在各个节点上,如何定位找到它们?
数据要多备份放置在多个节点上,这样一个丢失了,还可以用另外的节点操作。
DataNode设计——数据如何硬盘存放?
文件在NameNode已经分割成block,DataNode以block为单位对数据进行存取
Client读写的异常处理
- 文件写的时候客户端自己挂了:副本不一致,导致每次读出来的数据不一样;Lease(客户端要修改文件时,需要通过NameNode上锁,这个锁就是租约Lease,要定期刷的)无法释放,导致文件永远都无法被修改。解决方法:Lease Recovery
- 文件写入过程中DataNode出现异常,解决方法:Pipeline Recovery
- 读取文件过程中DataNode出现异常,解决方法:节点Failover
应用场景
- ETL——Extract、Transform、Load
- OLAP引擎
- HBase
- 机器学习
- 通用存储应用