HDFS 的读写流程
??HDFS 将文件切割为默认大小的块(block)存放在不同的 DataNode上; ??上传文件和读取文件是 HDFS 重要的流程;
HDFS 的写文件流程
图文解释: ??1、Client 连接 HDFS ,发送上传文件的请求; ??2、NameNode 响应请求,对文件进行校验;校验成功后返回要存放文件的 block 所对应的 DataNode 的信息列表; ????列如: ??????block01:dataNode1、dataNode2 ??????block02:dataNode2、dataNode4 ??3、Client 拿到了 dataNode 的列表后,开始上传文件; ??4、先上传 block1,按照列表将其上传到 dataNode1、dataNode2; ??5、所有的 dataNodes 列表中的数据块都上传完之后,返回确认上传信息; ??6、收到全部上传完毕的确认信息,Client 关闭文件输出流; ??7、NameNode 接收到 Client 的信息判断文件是否上传成功,如果成功就更新元数据信息;
步骤详解: ??1、使用 HDFS 提供的 Client 向 NameNode 发送RPC请求,请求上传文件; ??2、NameNode 收到请求,判断要上传的文件是否已经存在及路径是否完整及用户是否具备权限操作; ??3、NameNode 判断后,向 Client 返回说可以上传该文件; ??4、Client 将文件在逻辑上切分成多个 packets ,并在内部以数据队列 data queue 的形式对 packets 进行管理; ??5、Client 向 NameNode 申请 blocks 获取到存放 packets 及对应的副本(replicas) 的合适的 dataNodes 列表,副本数及列表的大小根据 namenode 中的 replication 来定; ????packet1 : replica1 : dataNode1 ????packet1 : replica2 : dataNode2 ????packet1 : replica3 : dataNode3
????packet2 : replica1 : dataNode2 ????packet2 : replica2 : dataNode3 ????packet2 : replica3 : dataNode4
????packet3 : replica1 : dataNode1 ????packet3 : replica2 : dataNode3 ????packet3 : replica3 : dataNode4
??6、Client 以管道(pipeline)形式将第一个 packet 上传到该 packet 对应的所有 replicas 中; ??7、Client 把 packet1 的第一个副本 replica1 以流的形式写入 dataNode1; ??8、dataNode1 存储了 packet1 的 replica1 之后,再将其复制为 replica2 并以 pipeline 的形式在 dataNodes 列表中的下一个 dataNode2 中,进行 replica2 的写入,之后的依次类推; ??9、列表中的最后一个 dataNode 完成传输之后,会通过 pipeline 返回给 Client 一个确认队列 ack packet; ??10、客户端根据 ack packet 返回的信息,确认 packet1 的 3 个 replica 全部传输完毕,将 data queue 中的 packet1 移除;然后进行接下来的 packet2、packet3 的传输; ??11、在传输的过程中如果某个 dataNode 出现了故障,将关闭当前的 pipeline 且将故障的 datanode 从 pipeline 中移除,剩余的 block 继续在剩下的 dataNode 中以 pipeline 的形式继续传输,且 Client 会通知 nameNode 并分配一个新的 dataNode,保持 replicas 设定的数量。 ??12、完成全部 packets 的传输之后,Client 调用 close() 关闭数据流; ??13、一个 packet 只要写入最小的副本数(dfs.replication.min 默认为1)即认为该 packet 已经写入成功,而该副本作为 block 可以在集群中进行异步复制,直到达到设定的副本数(dfs.replication 默认为3);因为 NameNode 在申请 blocks 时就知道了文件由哪些 blocks 组成,所以返回成功之前 NameNode 只需要等待 blocks 完成最小的复制量就好了;
HDFS 的读文件流程
图文解释: ??1、使用 HDFS 提供的 Client 向 NameNode 发送RPC请求,请求读取文件; ??2、NameNode 响应请求,返回该文件全部的 blocks 的信息,dataNodes 列表 ????列如: ??????block01:dataNode1、dataNode2、dataNode3 ??????block02:dataNode2、dataNode3、dataNode4 ??3、Client 会选择离 Client 最近的 dataNode 进行 block 的读取;如果 Client 本身就是 dataNode 节点,Client 就直接在本地读取; ??4、读取完当前的 block1 之后,Client 关闭当前 dataNode 的链接,然后寻找读取下一个 block2 的 dataNode; ??5、当读取完当前的 blocks 列表之后,发现整个文件还没有读取完,Client 会继续向 NameNode 请求下一批 blocks 的信息,再进行读取,直到读完整个文件; ??6、读取过程中,每读完一个 block 都会进行 checksum 验证;如果读取 dataNode 时出现错误,Client 将通知 NameNode 再从下一个拥有该 block 的 dataNode 继续读;
|