hdfs上传文件的过程:
以
hadoop fs -put a.txt /dir 为例
1、客户端向服务器发起上传请求(用rpc协议)
2、namenode收到请求后会进行权限检查:(1)看是否有操作权限(2)父目录是否存在
3、namenode给客户端反馈是否可以上传的标记
4、客户端会将要上传的文件按照设置的block大小进行切片,假如是切3片,blk1、blk2、blk3。
5、客户端向NameNode请求上传第一个block:blk1
6、NameNode收到上传block请求后,根据副本放置策略和主机的优秀程度选出三台最优主机{node1,node3,node5},
7、NameNode将三台主机返回给客户端
8、客户端和最前面的主机node1建立pipeline,node1和node3建立pipeline,node3和node5建立pipeline
9、客户端开始传输第一个block数据,传输数据的单位是package(64K),这里面是考虑到网络传输性能,客户端上传block时会再次切片,将block切成多个64KB大小的package,一个个的上传
10、node收到一个package就会缓存datanode,然后传给第二台,第二台缓存后传给第三台,直到传到最后一台。形成一个从客户端到最后一台主机的管道。
11、hdfs会产生一个应答队列,最后一台缓存结束后给他上一台一个ack应答,应答与第十步方向相反,直到第一台应答客户端。
12、客户端判断应答队列中的ack是否完整,如果完整,则判断此次package发送成功,然后继续发第二