HDFS的写数据流程
- 客户端通过Distributed FileSystem模块向Namenode请求上传文件,Namenode检查目标文件是否存在,父目录是否存在;
- Namenode返回是否可以上传文件;
- 客户端请求第一个block上传到哪几个DataNode服务器上;
- Namenode返回3个DataNode节点,分别是dn1,dn2,dn3;
- 客户端通过FSDataOutputSystem模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成;
- dn1,dn2,dn3逐渐应答客户端;
- 客户端开始向dn1上传第一个block,以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个Packet就会放入一个应答队列中等待应答;
- 客户端里有两个队列,一个待发送队列,一个应答队列。待发送的队列发送过数据后会将发送过的数据移到应答队列里,在得到DateNode的应答后才会将应答队列里的数据移除队列,标志着发送成功。
- 当一个block传输完成,客户端再次请求Namenode上传第二个Block的服务器。(重复执行3-7步)
HDFS的读数据流程
- 客服端通过Distributed FileSystem模块向Namenode请求下载文件,Namenode通过查询元数据,找到block所在的Datanode位置;
- 客户端向最近的Datanode节点请求读取数据;
- Datanode开始传输数据给客户端,以Packet为单位;
- 客户端以packet为单位接收,先在本地缓存,然后写入到目标文件中。