1.hdfs客户端创建一个DistributedFileSystem对象向NameNode请求下载文件file.txt,NameNode通过查找元数据,找到文件所在的DateNode地址。其中数据被切分成两个数据块,存放了3个副本。
2.NameNode返回目标文件的元数据信息,包含n个数据块及其副本所在的节点等信息,比如返回三个节点dn1,dn2,dn3.
3.hdfs客户端通过FsDataInputStream读取第一个数据块的数据,根据机架感知和就近原则会优先选取客户端所在集群节点dn1的数据块,如果客户端不在集群内则在集群内随机选择一个合适的节点读取。如果此时dn1挂掉的话,会去读取跟dn1节点在同一机架上的不同节点dn2。如果dn2挂掉的话,会去读取跟dn1,dn2在不同机架上的dn3节点。因为这样传输的话会大大降低网络流量的消耗。
4.开始传输数据。客户端会和DataNode的节点建立通信去传输数据,第一个数据块传输完后会传输第二个数据块,然后类推。
5.数据传输完毕后会关闭流。
机架感知原理
1.hdfs客户端创建一个DistributedFileSystem对象,它会向NameNode发送请求询问是否可以上传数据文件。
2.NameNode会检查用户权限以及目录结构,然后告知客户端是否可以上传数据。
3.客户端收到可以上传数据的信号后,它会向NameNode请求上传第一个Bolck块(0-128m)。
4.NameNode会根据副本数3返回3个节点dn1,dn2,dn3,表示用这n个节点存储数据。其中dn1是与客户端同一机器的本地节点,dn2是同一机架的不同节点,dn3是不同机架的节点
5.客户端根据FsDataOutputStream向dn1请求建立block传输通道,dn1向dn2请求建立通道,dn2向dn3请求建立通道
6.dn3向dn2应答成功,dn2向dn1应答成功,dn1向客户端应答成功。
7.开始传输数据,FsDataOutputStream会将每个Block分成一个一个的数据packet,每个数据包为64k,会将数据包依次写往多个节点的内存中,并且在写数据的过程中落盘
8.传输完毕后会关闭流



