HDFS的读写流程

hdfs的宏观写入流程:

        HDFS的读写流程

1.首先就是客户端向NameNode发送写入数据的请求。

2.文件系统通过rpc调用NameNode的create的功能。与此同时NameNode会检查是否有这个地址或者说是有这个权限去创造这个文件。如果存在,则返回给客户端一个确认消息,表明-你可以写入数据了,并同时创建一个空的对象Entry;但是如果没有的话,那我就只能返回给你一个错误信息了。

3.当DFS接收到这个确认消息之后,文件系统就会调用这个create功能给客户端创建一个对象  FSDataOutputStream(文件输出流)给客户端使用。

4.然后客户端就可以通过NameNode拿到第一个块的地址了。(此时NameNode通过机架感知策略拿到最近的那个node节点)

5.此时客户端就会与NameNode节点创建连接(其中是通过pipeline(管道)进行连接的)

6.客户端将数据按照块的形式进行切分,但是发送却是按照packet (包)的形式来进行传输。(默认一个packet 大小为64K,一个块的大小为128M)

7.客户端通过管道将包传输到FSDataOutputStream对象进行数据传输。

        7.1客户端首先将packet 发送到node01这里(不一定是node01,机架感知,谁近选择谁)同时给予node01一个ack状态

        7.2然后node01将page传输到最近的那个节点,包括ack状态。

        7.3此时就可以依照广播的特性,将这个信息传给所有的node节点,包括ack状态。

        7.4然后此时最后的节点,就会返回给前面的节点一个true信息,而这个true也会被广播传递,然后返回到node01这里。最后通过管道将这个true返回给客户端。

8.客户端接收到这个true之后,此时就可以确认这个包传递成功,然后就可以传递其他的包,直到这个块的包所有包都传递成功。然后就会删除这个管道。

9.一个块传递完毕之后,就会去NameNode那里拿去第二个块的地址。开启下一个块的传递路子。

10.当所有的块都传输成功,客户端会向NameNode传递一个信息。NN确认传输完成。然后关闭FSDataOutputStream,最后在NN在Entry中存储所有的File与Block与DN的映射关系。

HDFS的微观写入流程:

HDFS的读写流程

1.首先客户端会将数据以流的形式将数据从硬盘上传输到缓存中。

2.然后缓存的数据以chunk(512B)和checksum(4B)的形式存入packet 

3.当packet 满的时候,加入到dataqueue(数据列表)

4.datastreamer(数据流)开始从dataqueue队列上取出一个packet,通过FSDataOPS发送到Pipleline(管道)

5. 客户端发送一个Packet数据包以后开始接收ack,会有一个用来接收ack的ResponseProcessor进程,如果收到成功的ack

        5.1. 如果某一个packet的ack为true,那么就从ackqueue删除掉这个packet
        5.2. 如果某一个packet的ack为false,将ackqueue中所有的packet重新挂载到 发送队列,重新发送

HDFS读数据流程

HDFS的读写流程

 首先客户端发送请求到DFS,申请读取某一个文件
/yjx/tomcat.tar.gz
DFS去NN查找这个文件的信息(权限,文件是否存在)
如果文件不存在,抛出指定的错误
如果文件存在,返回成功状态
DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
客户端获取文件第一个Block信息,返回DN1 DN2 DN8
客户端直接就近原则选择DN1对应的数据即可
依次类推读取其他块的信息,直到最后一个块,将Block合并成一个文件
关闭FSDataInputStream

上一篇:HDFS编程实践-HDFS常用命令实践操作


下一篇:句柄和指针的区别和联系是什么?