HDFS读写流程详细解读

HDFS读文件流程:

在这里插入图片描述

读取文件过程简述:

1、客户端向NameNode发起读数据请求;
2、NameNode响应请求并告诉客户端要读的文件的数据块位置(存在哪个DataNode上);
3、客户端到对应DataNode读取数据,当数据读取到达末端,关闭与这个DataNode的连接,并查找下一个数据块,直到文件数据全部读完;
4、最后关闭输出流。

读取文件过程详细解读:

1、客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。
2、通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
3、获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
4、如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
5、到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。直到文件数据全部读完;
6、客户端调用close ,关闭输入流DFS InputStream



HDFS写文件流程:

在这里插入图片描述
写文件过程简述:

1、客户端向NameNode发起写数据请求;
2、NameNode相应请求(NameNode会检查要创建的文件是否已经存在,创建者是否有权限,成功会创建一个记录,失败会报异常); 
3、客户端将文件进行切片(分成数据块),然后上传数据块,按照一个一个的形式进行发送,每个数据块都要写到三DataNode上;
4、成功后DataNode会返回一个确认队列给客户端,客户端进行效验,然后客户端上传下一个数据块到DataNode,直到所有数据块写入完成;
5、当所有数据块全部写入成功后,客户端会向NameNode发送一个反馈并关闭数据流。

写文件过程详细解读:

1、使用 HDFS 提供的客户端 Client,向远程的 NameNode 发起 RPC 请求;
2、NameNode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会 为文件创建一个记录,否则会让客户端抛出异常;
3、当客户端开始写入文件的时候,客户端会将文件切分成多个 packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,并向 NameNode 申请 blocks,获取用来存储 replicas 的合适的 DataNode 列表,列表的大小根据 NameNode 中 replication 的设定而定;
4、开始以 pipeline(管道)的形式将 packet 写入所有的 replicas 中。客户端把 packet 以流的方式写入第一个 DataNode ,该 DataNode 把该 packet 存储之后,再将其传递给在此 pipeline 中的下一个 DataNode ,直到最后一个 DataNode ,这种写数据的方式呈流水线的形式;
5、最后一个 DataNode 成功存储之后会返回一个 ack packet(确认队列),在 pipeline 里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet;
6、如果传输过程中,有某个 DataNode 出现了故障,那么当前的 pipeline 会被关闭,出现故障的 DataNode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 DataNode 中继续 以 pipeline 的形式传输,同时 NameNode 会分配一个新的 DataNode ,保持 replicas 设定的 数量;
7、客户端完成数据的写入后,会对数据流调用 close()方法,关闭数据流

猜你喜欢

转载自blog.csdn.net/qq_42578036/article/details/110880715