一、HDFS写数据流程
1.1 剖析文件写入
HDFS
写数据流程,如图所示:
- 客户端通过
DIstributed FileSystem
模块向NameNode
请求上传文件,NameNode
检查目标文件是否存在,父目录是否存在 NameNode
返回是否可以上传- 客户端对上传文件进行拆分为块,客户端请求第一个
Block
上传到哪几个DataNode
服务器上 NameNode
返回DataNode
节点名,分别是dn1
、dn2
、dn3
- 客户端通过
FSDataoutputStream
模块请求dn1
上传数据,dn1
收到请求会继续调用dn2
,然后dn2
调用dn3
,将这个通信管道建立完成 dn1
、dn2
、dn3
逐级应答客户端- 客户端开始往
dn1
上传第一个Block
(先从磁盘读取数据放到一个本地内存缓存),以Packet
为单位,dn1
收到一个Packet
就会传给dn2
,dn2
传给dn3
;dn1
每传一个Packet
会放入一个应答队列等待应答 - 当第一个
Block
传输完成之后,客户端再次请求NameNode
上传第二个Block
的服务器(重复执行3-7步)
1.2 副本存储节点选择
在HDFS
写数据的过程中,NameNode
会选择距离待上传数据最近距离的DataNode
接收数据。那么这个最近距离怎么计算呢?
节点距离:两个节点到达最近的共同祖先的距离总和。
同一节点的进程距离/D1/R1/N1->/D1/R1/N1
:0
同一机架上的不同节点/D1/R1/N1->/D1/R1/N2
:2
同一数据中心不同机架上的不同节点/D1/R1/N1->/D1/R2/N1
:4
不同数据中心的节点:/D1/R1/N1->/D2/R1/N1
:6
所以说我们在客户端上传副本时,比如在Hadoop100
上传文件,并限制副本数为1,那么选择的DataNode
一定是Hadoop100
机器。
Hadoop官网: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个副本,第一个副本在Client
所处的节点上,如果客户端在集群外,则随机选择一个;第二个副本和第一个副本位于相同机架不同节点;第三个节点位于不同机架随机节点。
这样能够保证性能和安全性的平衡性。
二、HDFS读数据流程
HDFS
读数据流程,如图所示:
- 客户端通过
Distributed FileSystem
向NameNode
请求下载文件,NameNode
通过查询元数据,找到文件块所在的DataNode
地址 - 挑选一台
DataNode
(接近原则,然后随机)服务器,请求读取数据 DataNode
开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet
为单位来做校验)- 客户端以
Packet
为单位接收,先在本地缓存,然后写入目标文件