Hadoop DataNode的读和写流程--转载

DataNode的写操作流程

DataNode的写操作流程可以分为两部分,第一部分是写操作之前的准备工作,包括与NameNode的通信等;第二部分是真正的写操作。我们先看第一部分。

Hadoop DataNode的读和写流程--转载

Hadoop DataNode的读和写流程--转载

  1. 首先,HDFS client会去询问NameNode,看哪些DataNode可以存储Block A-file.txt文件的拆分是在HDFS client中完成的,拆分成了3个Block (A,B,C)。因为NameNode存储着整个文件系统的元数据,它知道哪个DataNode上有空间可以存储这个Block A。
  2. NameNode通过查看它的元数据信息,发现DataNode1,2,7上有空间可以存储Block A,于是将此信息告诉HDFS Client。
  3. HDFS Client接到NameNode返回的DataNode列表信息后,它会直接联系第一个DataNode-DataNode1,让它准备好接收Block A - 实际上就是建立彼此间的TCP连接。然后将Block A和NameNode返回的所有关于DataNode的元数据一并传给DataNode1.
  4. 在DataNode1与HDFS Client建立好TCP连接后,它会把HDFS Client要写Block A的请求顺序传给DataNode2(在与HDFS Client建立好TCP连接后从HDFS Client获得的DataNodeli信息),要求DataNode2也准备好接收Block A(建立DataNode2到DataNode1的TCP连接)。
  5. 同上,建立DataNode2到DataNode7的TCP连接。
  6. 当DataNode7准备好之后,它会通知DataNode2,表明可以开始接收Block A。
  7. 同理,当DataNode2准备好之后,它会通知DataNode1,表明可以开始接收Block A。
  8. 当HDFS Client接到DataNode1的成功反馈信息后,说明这3个DataNode都准备好了,HDFS Client就会开始往这三个DataNode写入Block A。

下面这张图片展示了HDFS Client如何往DataNode写入Block A数据。

 

Hadoop DataNode的读和写流程--转载

在DataNode1,2,7都准备好接收数据后,HDFS Client开始往DataNode1写入Block A数据。同准备工作一样,当DataNode1接收完Block A数据后,它会顺序将Block A数据传输给DataNode2,然后DataNode2再传输给DataNode7. 每个DataNode在接收完Block A数据后,会发消息给NameNode,告诉它Block数据已经接收完毕,NameNode同时会根据它接收到的消息更新它保存的文件系统元数据信息。当Block A成功写入3个DataNode之后,DataNode1会发送一个成功信息给HDFS Client,同时HDFS Client也会发一个Block A成功写入的信息给NameNode。之后,HDFS Client才能开始继续处理下一个Block-Block B。

机架感知

其实NameNode在挑选合适的DataNode去存储Block的时候,不仅仅考虑了DataNode的存储空间够不够,还会考虑这些DataNode在不在同一个机架上。这就需要NameNode必须知道所有的DataNode分别位于哪个机架上(所以也称为机架感知)。当然,默认情况下NameNode是不会知道机架的存在的,也就是说,默认情况下,NameNode会认为所有的DataNode都在同一个机架上(/defaultRack)。除非我们在hdfs-site.xml里面配置topology.script.file.name选项,这个选项的值是一个可执行文件的位置,而该只执行文件的作用是将输入的DataNode的ip地址按照一定规则计算,然后输出它所在的机架的名字,如/rack1, /rack2之类。借助这个文件,NameNode就具备了机架感知了。当它在挑选DataNode去存储Block的时候,它会遵循以下原则:

  1. 首先挑选跟HDFS Client所在的DataNode作为存放第一个Block副本的位置,如果HDFS Client不在任何一个DataNode上,比如说Hadoop集群外你自己的电脑,那么就任意选取一个DataNode。
  1. 其次,会借助NameNode的机架感知特性,选取跟第一个Block副本所在DataNode不同的机架上的任意一个DataNode来存放Block的第二个副本,比如说/rack2。Block的第三个副本也会存在这个/rack2上,但是是另外一个DataNode
  2. 最后,如果我们设置的副本的数量大于3,那么剩下的副本则随意存储在集群中。

所以,按照上面的原则,在HDFS Client进行Block的写操作时,流程应该如下面图所示:

 

Hadoop DataNode的读和写流程--转载

DataNode的读数据流程

最后,我们来看看HDFS Client是如何从DataNode读取数据的。

 

Hadoop DataNode的读和写流程--转载

Hadoop DataNode的读和写流程--转载

如上图所示,首先,HDFS Client会先去联系NameNode,询问file.txt总共分为几个Block而且这些Block分别存放在哪些DataNode上。由于每个Block都会存在几个副本,所以NameNode会把file.txt文件组成的Block所对应的所有DataNode列表都返回给HDFS Client。然后HDFS Client会选择DataNode列表里的第一个DataNode去读取对应的Block,比如由于Block A存储在DataNode1,2,7,那么HDFS Client会到DataNode1去读取Block A;Block C存储在DataNode,7,8,9,那么HDFS Client就回到DataNode7去读取Block C。



作者:可文分身
链接:https://www.jianshu.com/p/7e52a7f8d16d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。