写在前面: 不考虑HA和Federation架构,如果本文有错误的地方还望大佬指出,小弟不胜感激.
1.客户端通过shell命令的方式传输文件到HDFS上(申请上传)
hdfs dfs -put a.txt /tmp
#如果添加了-f就会覆盖掉hdfs上/tmp/a.txt文件
2.namenode检查文件夹是否存在,检查文件是否存在,如果文件夹不存在是肯定不能上传的,如果文件存在就要看有没有覆盖写入了
3.返回允许上传通知
1-3步图片
4.判断文件的大小,然后切割文件,默认按照128m去切割(hadoop2.x)按照64m去切割(hadoop1.x)
-
思考: 为什么是128m呢?
- 最小化寻址开销,如果太小,namenode的压力就会比较大,如果太大,datanode在计算的时候压力就会比较大,一般我们都会手动设置这个大小.
5.通知namenode上传第一个block块
6.namenode通过副本机制得到block块应该放在哪些datanode节点上的地址列表
-
思考: 副本机制应该返回哪些datanode节点呢?
-
假设3个副本,如果文件在datanode的节点上,第一个副本应该在客户端所在的datanode节点上,也就是本地,这样可以避免网络传输,如果文件不是在datanode的节点上,应该是随机发送到一个datanode上的.
第二个副本应该是放在第一个副本的不同机架上,设计思想:容灾
第三个副本应该是放在和第二个相同的机架上,设计思想:避免网络传输造成不要开销
7.返回这些地址给client端