Hadoop DataNode的读和写流程

96
可文分身
2014.04.23 16:46* 字数 1387

从上一篇文章中我们已经知道了NameNode和Secondary NameNode的职责,这篇文章我们主要讲讲我们怎么往DataNode上写数据和读数据。

DataNode的写操作流程

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

  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数据。


在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的写操作时,流程应该如下面图所示:


DataNode的读数据流程

最后,我们来看看HDFS Client是如何从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。

大数据
Web note ad 1