一、HDFS写数据流程
1.1、刨析文件写入
- 客户端通过
Distributed FileSystem
模块向NameNode
请求上传文件,NameNode
检查目标文件是否已经存在,父目录是否存在。 NameNode
返回是否可以上传文件- 客户端请求第一个
Block
上传到那几个DataNode
服务器上 NameNode
返回3个DataNode
节点,分别为dn1
、dn2
、dn3
。- 客户端通过
FSDataOutputStream
模块请求dn1
上传数据,dn1
收到请求后会继续调用dn2
,然后dn2
调用dn3
,将这个通信管道建立完成 dn1
、dn2
、dn3
逐级应答客户端- 客户端开始向
dn1
上传第一个Block
(先从磁盘读取数据放到第一个本地内存缓存),以Packet
为单位,dn1
收到一个Packet
就会传给dn2
,dn2
传给dn3
;dn1
每传一个Packet
就会放入一个应答队列等待应答。 - 当一个
Bock
传输完成后,客户端再次请求NameNode
上传第二个Block的服务器(重复3-7步)
在HDFS写数据的过程中,NameNode会选择距待上传数据最近距离的DataNode接收数据,那么这个最近的距离怎么算?
1.2、网络拓扑-节点距离计算
节点距离:两个节点到达最近的共同祖先的距离总和
1.3 机架感知(副本存储节点选择)
官方文档:
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.
翻译:
对于常见情况,当复制因子为3时,HDFS的放置策略是将一个副本放在本地机架中的一个节点上,另一个放在本地机架中的不同节点上,最后一个放在不同机架中的不同节点上。
- 第一个副本处在Client所处的节点上,如果客户端在集群外,这随机选择一个
- 第二个副本与第一个副本处于相同机架,随机节点
- 第三个副本处于不同机架,随机节点
二、HDFS读数据流程
- 客户带通过
Distributed FileSystem
向NameNode
请求下载文件,NameNode
通过查询元数据,找到文件块所在的DataNode
地址,将地址返回Distributed FileSystem
。 - 客户端通过挑选一台
DataNode
服务器读取数据(就近原则,然后随机) DataNode
开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet
为单位做校验)- 客户端以
Packet
为单位接收,现在本地缓存,然后写入目标文件。