一、写数据
1. 客户端写数据流程
- 客户端向NameNode请求上传数据
- NameNode响应请求,允许客户端上传数据
- 客户端请求上传一个block
- NameNode响应请求,返回上传对应的DataNode
- 客户端根据DataNode距离,选择最近的DataNode建立传输通道
- DataNode响应请求
- 客户端传输数据
- 传输完成则结束,未完成则回到3
2. 副本存储节点选择
DataNode根据NameNode的调度信息,采用类似客户端的流程向其他DataNode传输 block来备份数据。
对于文件副本数为3的情况,HDFS默认将第一个副本存储在client所在的节点上,若client在集群外,则随机选择一个节点;第二个副本存储在第一个副本相同机架的节点上;第三个副本存储在与前两个副本不同机架的随机节点上。在保证性能和安全性的同时优先选择了性能。
二、读数据
- 客户端向NameNode请求读取某一个文件
- NameNode返回这个文件的元数据
- 客户端根据元数据存储的信息顺序请求block
- DataNode响应并返回block数据
若有多个block且分布在不同节点上,则顺序读取;若多个block都在同一个节点上,则一次性传输完。
三、NN和2NN
1. NN的功能
NN(NameNode)用来存储数据的元信息,即数据的大小、名字、块数、分布在哪些节点上等信息,并在客户端请求时将操作发送到各个节点。
因为需要随机访问,所以NN将元数据存储在内存中以提高访问效率。但若只存储在内存中,一旦断电就会导致元数据丢失,这个集群就无法工作了,所以NN还在硬盘中维护了元数据的备份fsimage。
在硬盘中直接修改fsimage涉及到寻址和读写等过程,效率比较低。若是在更新内存中数据的同时修改fsimage,必然会使性能极大的降低。因此,NN还维护了许多edits文件,记录fsimage的变更内容。这样的话,一旦断电,使用fsimage和edits合并就可以还原元数据。
2. 2NN的功能
NN需要维护元数据和fsimage,并在进行增删改操作时添加edits文件,随时操作次数的增加,必然会使得edits文件越来越多,恢复元数据的速度也会越来越慢。因此,2NN就承担了为NN定期合并fsimage和edits文件的工作,同时又避免了NN的负担过重。
3. NN和2NN的工作机制
1) NN
- NN维护为每个文件都维护一份元数据和fsimage和edits文件
- 在断电重启后,通过fsimage和edits恢复元数据
在进行增删改操作时,先在内存中进行修改,再新建edits_inprogress文件,并将之前的edits_inprogress修改为edits文件
2) 2NN
维护与NN相同的元数据、fsimage和edits文件
- 检查NN是否需要CheckPoint
- 定时时间到
- edits中的数据满了
- 合成新的fsimage
- 将新的fsimage递交给NN