HDFS读写文件详细过程

HDFS写文件

写文件的大致过程如下图所示:

HDFS读写文件详细过程

HDFS写文件过程详解:

1.客户端首先会向NameNode提交写文件申请

2.NameNode检查用户权限和是否存在该目录文件等问题,决定是否可以上传

3.NameNode返回是否可以上传

4.如果NameNode返回可以上传,客户端就会向NameNode申请上传第一个block

5.NameNode根据机架感知机制和DataNode空间大小等问题,返回三个(默认)DataNode地址

6.客户端和返回的三台DataNode建立通信管道,本质是RPC调用,DN1收到请求后会调用DN2,DN2收到后会调用DN3,然后逐级返回给客户端报告管道建立完成

7.管道建立完成之后就开始第一个block的传输,是以packet(64k)为单位进行传输,DN1收到后通过管道复制给DN2,DN2复制给DN3

8.当第一个block传输完成之后DataNode会逐级返回上传完成

9.客户端收到第一个block传输完成之后,就会重复4-8进行第二个block的传输

HDFS读文件

读文件的大致过程如下图:

HDFS读写文件详细过程

HDFS读文件详解:

  1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
  2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都 会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构 得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
  3. Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从 本地直接获取数据(短路读取特性);
  4. 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
  5. 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一 批的 block 列表;
  6. 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会 通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
  7. read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请 求包含块的DataNode地址,并不是返回请求块的数据;
  8. 终读取来所有的 block 会合并成一个完整的终文件。