HDFS的数据读写过程

Posted 走出一条属于自己的路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的数据读写过程相关的知识,希望对你有一定的参考价值。

一、读数据过程

1、客户端通过FileSystem.open()打开文件,相应地,再HDFS文件系统中DistributedFileSystem具体实现了FileSystem。因此,调用open()方法后,DistributedFileSystem会创建输入流FSDataInputStream,对于HDFS而言,具体的输入流就是DFSInputStream。

3、获得输入流FSDataInputStream后,客户端调用read()函数开始读取数据。输入流根据前面的排序结果,选择距离客户端最近的数据节点建立连接并读取数据。

4、数据从该数据节点读到客户端;当该数据块读取完毕时,FSDataInputStream关闭和该数据节点的连接。

5、输入流通过getBlockLocations()方法查找下一个数据块(如果客户端缓存中已经包含了该数据快的位置信息,就不需要调用该方法)。

6、找到该数据块的最佳数据节点,读取数据。

7、当客户端读取完毕数据的时候,调用FSDataInputStream的close()函数,关闭输入流。

需要注意的是,在读取数据的过程中,如果客户端与数据节点通信时出现错误,就会尝试连接包含此数据块的下一个数据节点。




二、写数据过程

1、客户端通过FileSystem.create()创建文件,相应地,在HDFS文件系统中DistributedFileSystem具体实现FileSystem。因此,调用create()方法后,DistributedFileSystem会创建输出流FSDataOutputStream,对于HDFS而言,具体的输出流就是DFSOutputStream。

2、然后,DistributedFileSystem通过RPC远程调用名称节点,在文件系统的命名空间中创建一个新的文件。名称节点会执行一些检查,比如文件是否已经存在、客户端是否有有权限创建文件等。检查通过之后,名称节点会构造一个新文件,并添加文件信息。远程方法调用结束后,DistributedFileSystem会利用DFSOutputStream来实例化FSDataOutputStream,返回给客户端,客户端使用这个输出流写入数据。

3、获得输出流FSDataOutputStream以后,客户端调用输出流的write()方法向HDFS中的对应的文件写入数据。

4、客户端向输出流FSDataOutputStream中写入的数据会首先被分成一个个的分包被放入DFSOutputStream对象的内部队列。输出流FSDataOutputStream会向名称节点申请保存文件和副本数据块的若干个数据节点,这些数据节点形成一个数据流管道。队列中的分包最后被打包成数据包,发往数据流管道中的第一个数据节点,第一个数据节点将数据包发送给第二个数据节点,第二个数据节点将数据包发送给第三个数据节点,这样,数据包会流经管道上的各个数据节点。

5、因为各个数据节点位于不同的机器上,数据需要通过网络传送。因此,为了保证所有数据节点的数据都是准确的,接收到数据的数据节点要向发送者发送“确认包”。确认包沿着数据流管道逆流而上,从数据流管道依次经过各个数据节点并最终发往客户端,当客户端收到应答时,它将对应的分包从内部队列移除。不断执行3~5,直到数据全部写完。

6、客户端调用close()方法关闭输出流,此时开始,客户端不会再向输出流中写入数据,所以,当DFSOutputStream对象内部队列中的分包都收到应答以后,就可以使用ClientProtocol.complete()方法通过名称节点关闭文件,完成一次正常的写文件过程。

以上是关于HDFS的数据读写过程的主要内容,如果未能解决你的问题,请参考以下文章

HDFS读写数据过程

HDFS数据存储与读写过程

hdfs读写过程是怎样的?

HDFS的读过程

HDFS文件读写过程

hdfs的读写过程