Hadoop--HDFS之读写流程
之前的博客,HDFS NameNode 和HDFS DataNode 让我们对HDFS两个重要的角色,NameNode和DataNode有了一定的认识。NameNode负责维护元数据信息,DataNode负责Block块数据的存储。HDFS的设计就是一次写入,多次读取,不支持文件修改,所以呢,文件的读写就变得相当重要,下面我们就一起来看一看HDFS文件的读写流程吧!
写入文件
- DataNode的写操作流程 可以分为两部分:
- 准备工作,包括与NameNode的通信等;
- 真正的写操作。
- 准备工作
- HDFS client先会去询问NameNode,看哪些DataNode可以存储文件。文件的拆分是在HDFS client中完成的,比如拆分成A、
B
、C
。 - NameNode查看它的元数据信息,发现DataNode
1
,2
,7
上有空间可以存储Block A,于是将此信息告诉HDFS Client。 - HDFS Client接到NameNode返回的DataNode列表信息后,它会直接联系第一个DataNode1,让它准备好接收Block A(建立TCP连接)。
- 在DataNode1建立好TCP连接后它会把HDFS Client要写Block A的请求顺序传给DataNode2(在与HDFS Client建立好TCP连接后从HDFS Client获得的DataNodeli信息),同理传递给DataNode7。
- 当DataNode7准备好后,会回传信息过来,HDFS Client接到信息后表示都准备好了,就可以写数据了。
- 写入数据
- 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。
读取文件
- 读取文件
- 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。