HDFS读写数据流程

1.HDFS写数据流程解析

HDFS读写数据流程
1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2)NameNode返回是否可以上传。
3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

2.关于写入数据失败的问题

(1)在5、6过程的建立请求和应答阶段,任意位置失败了写入数据直接失败。
(2)在7传输数据过程中,分两种情况:(a)如果在A处失败了,则写入数据失败。(b)如果在B、C两处失败,则返回写入数据成功。
原因是如果我设置了3个备份,现在已经有一个备份成功了,另外两个失败了会触发自动备份。DataNode1会再找两个节点将数据分发过去进行备份。

3.Hadoop2.x副本节点选择

HDFS读写数据流程
机架感知说明官方文档
For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on one node in the local rack, another on a different node in the local rack, and the last on a different node in a different rack.
1.第一个副本再Client所处的节点上。如果客户端在集群外,随机选一个:
如上图所示,假设N1、N2、N3是一个集群的三个节点。
如果此时Client客户端是在R1上(集群外),则随机选取N1、N2、N3中的任意一个存放第一个副本。
如果此时Client客户端是在N1上(集群中),则直接选取N1(此时拓扑距离是0)存放第一个副本。

2.第二个副本和第一个副本位于相同机架,不同于副本一的节点。
如果此时第一个副本在N1上了,那么第二个副本可以随机的存放在(与N1是同一个)R1的N2或者N3中。

3.第三个副本位于不同机架,随机节点(但不会跨数据中心,即不会放在D2下的任意节点)。
如果此时第一个副本在D1下的R1下的N1,第二个副本在D1下的R1下的N2,那么第三个副本只能在D1下的R2或者R3下的子节点N1、N2、N3中的任意一个,不可能跑到D2的子节点下去。

4.HDFS读数据流程

HDFS读写数据流程
1)客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。