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发送成功,然后继续发第二个
13、重复这个过程,直到所有的package传完,三台主机的datanode会将缓存中的package合成block,落盘
14、重复执行5~13步,知道所有的block传完。
15、客户端向NameNode汇报文件上传完毕
16、NameNode更新自己内存中的元数据。
以上16步,参考学习内容已经博客铁人史大颗博客内容https://blog.csdn.net/xingyunyang/article/details/126294070
以下内容为本人原创并总结:
在正式上传前,客户端跟NameNode有2次问答连接通信,就是一来一回的通信,第一次是1-3步,判断是否可以上传,第二次是获取数据存放主机5-7步。
客户端有两层切片,第一层是将文件切成block,第二层是将block切成package。
上传文件用的是pipeline,通过跟抗洪递沙袋一样的方式,人站成一排,把沙袋从排头传到排位,然后成功后依次回复收到的指令(ack)
最后一次是不用回答的通信,客户端向NameNode汇报上传完毕,NameNode更新自己内存中的元数据
版权归原作者 地球村第一生产队首席村民 所有, 如有侵权,请联系我们删除。