Hadoop DataNode的读和写流程

从上一篇文章中我们已经知道了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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 9,763评论 0 2
  • hadoop HDFS原理解析01 HDFS架构•NameNode•DataNode•Sencondary Nam...
    白菜青萝卜阅读 7,737评论 2 30
  • 感恩,知足,珍惜。
    诗水年华阅读 1,666评论 0 0
  • 冬天东北的风,是凛冽的,是刺骨的,北风吹得鼻涕次啦,鼻涕还没流淌出鼻孔,鼻孔内就感觉到硬硬的冰点。北风吹得脸颊刺痛...
    Iris_虹阅读 1,792评论 0 0
  • 阿黎拖着巨大的婚纱摆一路从教堂奔到公路,心里暗骂某人,不知道她连考个四百米都叫苦不迭的人吗,溜得跟兔子一样怎么追啊...
    豆芽green阅读 1,621评论 2 2

友情链接更多精彩内容