一、写数据

1. 客户端写数据流程

  1. 客户端向NameNode请求上传数据
  2. NameNode响应请求,允许客户端上传数据
  3. 客户端请求上传一个block
  4. NameNode响应请求,返回上传对应的DataNode
  5. 客户端根据DataNode距离,选择最近的DataNode建立传输通道
  6. DataNode响应请求
  7. 客户端传输数据
  8. 传输完成则结束,未完成则回到3

    2. 副本存储节点选择

    DataNode根据NameNode的调度信息,采用类似客户端的流程向其他DataNode传输 block来备份数据。
    对于文件副本数为3的情况,HDFS默认将第一个副本存储在client所在的节点上,若client在集群外,则随机选择一个节点;第二个副本存储在第一个副本相同机架的节点上;第三个副本存储在与前两个副本不同机架的随机节点上。在保证性能和安全性的同时优先选择了性能。

二、读数据

  1. 客户端向NameNode请求读取某一个文件
  2. NameNode返回这个文件的元数据
  3. 客户端根据元数据存储的信息顺序请求block
  4. 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

  1. NN维护为每个文件都维护一份元数据和fsimage和edits文件
  2. 在断电重启后,通过fsimage和edits恢复元数据
  3. 在进行增删改操作时,先在内存中进行修改,再新建edits_inprogress文件,并将之前的edits_inprogress修改为edits文件

    2) 2NN

  4. 维护与NN相同的元数据、fsimage和edits文件

  5. 检查NN是否需要CheckPoint
    1. 定时时间到
    2. edits中的数据满了
  6. 合成新的fsimage
  7. 将新的fsimage递交给NN

四、fsimage和edits文件

  • fsimage:HDFS文件系统的永久检查点,包含HDFS所有目录和文件的序列化信息
  • edits:记录了HDFS文件系统中所有更新操作的路径
  • seen_txid:保存一个数字,就是最后一个edits的数字

    1. 使用oiv命令查看fsimage文件

    2.使用oev命令查看edits文件