大数据之HDFS的读写操作

大数据之HDFS的读写操作

读操作

官方图

大数据之HDFS的读写操作_第1张图片

详解图

大数据之HDFS的读写操作_第2张图片

流程解释

1.客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是
DistributedFileSystem,它通过使用远程过程调用(RPC)来调用namenode,以确定文件起始块的位置 

2.对于每一个块,NameNode返回存有该块副本的DataNode地址,并根据距离客户端的远近来排序。 

3.DistributedFileSystem实例会返回一个FSDataInputStream对象(支持文件定位功能)给客户端以便
读取数据,接着客户端对这个输入流调用read()方法 

4.FSDataInputStream随即连接距离最近的文件中第一个块所在的DataNode,通过对数据流反复调用
read()方法,可以将数据从DataNode传输到客户端 

5.客户端会将第一块儿数据保存到本地的文件中,后续的第二块儿数据会在第一块儿后面进行追加. 

6.当读取到块的末端时,FSInputStream关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode 

7.客户端从流中读取数据时,块是按照打开FSInputStream与DataNode的新建连接的顺序读取的。它也会根
据需要询问 NameNode来检索下一批数据块的DataNode的位置。一旦客户端完成读取,就对FSInputStream
调用close方法

写操作

官方图

大数据之HDFS的读写操作_第3张图片

详解图

大数据之HDFS的读写操作_第4张图片

流程解释

客户端(操作者)通过调用DistributedFileSystem对象的create()方法(内部会调 用HDFSClient对象的 
create()方法),实现在namenode上创建新的文件并返回一个FSDataOutputStream对象 

1.DistributedFileSystem要通过RPC调用namenode去创建一个没有blocks关联的新文件,此时该文件中
还没有相应的数据块信息 

2.但是在新文件创建之前,namenode执行各种不同的检查,以确保这个文件不存在以及客户端有新建该文件的
权限。如果 检查通过,namenode就会为创建新文件记录一条事务记录(否则,文件创建失败并向客户端抛出一
个IOException异常)。DistributedFileSystem向客户端返回一个FSDataOuputStream对象 

3.FSDataOutputStream被封装成DFSOutputStream。DFSOutputStream能够协调namenode和
datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据分成一个个的数据
包(packet),并写入一个内部队列,这个队列称为“数据队列”(data queue)

4.DataStreamer会去处理接受data quene,它先询问namenode这个新的block最适合存储的在哪几个
datanode里(比方副本数是3。那么就找到3个最适合的datanode),把他们排成一个 pipeline。
DataStreamer把packet按队列输出到管道的第一个datanode中。第一个datanode又把packet输出到
第二个datanode中。以此类推。DataStreamer在将一个个 packet流式的传到第一个DataNode节点后,还
会将packet从数据队列移动到另一个队列确认队列 (ack queue)中.确认队列也是由packet组成,作用是
等待datanode完全接收完数据后接收响应. 

5.datanode写入数据成功之后,会为ResponseProcessor线程发送一个写入成功的信息回执,当收到管道中
所有的datanode确认信息后,ResponseProcessoer线程会将该数据包从确认队列中删除。 

6.客户端写完数据后会调用close()方法,关闭写入流. 7.DataStreamer把剩余的包都刷到pipeline里,然
后等待ack信息,收到最后一个ack后,客户端通过调用DistributedFileSystem对象的complete()方法
来告知namenode数据传输完成.

你可能感兴趣的:(Hadoop,hdfs)