Hadoop中HDFS的读写流程详解

一、HDFS写流程示意图:
Hadoop中HDFS的读写流程详解_第1张图片
(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,检查客户端是否有权限,如果以上条件均满足,执行(2)
(2)NameNode响应客户端的请求,允许其上传文件。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。
(注意:NameNode在返回3个DataNode节点之前,会存储相关信息到元数据,用于对其的管理)
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
(注意:这里是根据网络拓扑计算节点的距离,按照最近距离进行分配。一般而言,再本机机架节点负载允许的范围内,会优先选择本机机架节点当作dn1,然后选择最近的机架。用改机架的两个服务端当作其余两个节点dn1,dn2)
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(注意:这里的通信信道建立属于类似“串联”的方式进行连接。是由客户端根据NameNode的返回信息,找到dn1,然后,dn1找dn2,dn2找dn3)
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(注意:此处再传送packet时,会再建立一个队列,用于暂存还未存储的packet,当packet请求存储成功后,会从队列中删除,这样做的目的是,防止传输时,packet因为请求延迟等原因,导致信息丢失)
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
二、 HDFS读数据流程

Hadoop中HDFS的读写流程详解_第2张图片
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
解读NameNode里的{bk_1,bk_2}{bk_1,bk_2}
表示该文件由{bk_1,bk_2}组成,这个{bk_1,bk_2}分别存在DataNode里面,而NameNode中只有元数据(用于表示文件所在DataNode的位置)。
三、解释NameNode的机架感应(即在写文件时,NameNode是如何来选择DataNode节点)
以下解释来自官方文档
*

For the common case, when the replication factor is three, HDFS’s
placement policy is to put one replica on the local machine if the
writer is on a datanode, otherwise on a random datanode, another
replica on a node in a different (remote) rack, and the last on a
different node in the same remote rack. This policy cuts the
inter-rack write traffic which generally improves write performance.
The chance of rack failure is far less than that of node failure; this
policy does not impact data reliability and availability guarantees.
However, it does reduce the aggregate network bandwidth used when
reading data since a block is placed in only two unique racks rather
than three. With this policy, the replicas of a file do not evenly
distribute across the racks. One third of replicas are on one node,
two thirds of replicas are on one rack, and the other third are evenly
distributed across the remaining racks. This policy improves write
performance without compromising data reliability or read performance.
解释:
对于常见的情况,当副本为 3 时,HDFS 的 放置策略是在本地机器上放置一个副本,如果本机的DataNode负载还可用,则写在本机,否则在选择一个随机DataNode上,另一个 副本在不同(远程)机架中的节点上,最后一个在 同一个远程机架中的不同节点。(意味着最后两个副本在负载等允许的情况下,会写在同一个机架的不同DataNode上)该政策削减了机架间写入流量,通常会提高写入性能。 机架故障的几率远小于节点故障;这 政策不会影响数据可靠性和可用性保证。但是,它确实会减少在以下情况下使用的总网络带宽 读取数据,因为一个块仅放置在两个唯一的机架中,而不是 超过三个。使用此策略,文件的副本不均匀分布在机架上。三分之一的副本在一个节点上, 三分之二的副本在一个机架上,另外三分之一是均匀的 分布在其余的机架上。此策略改进了写入性能而不影响数据可靠性或读取性能。

你可能感兴趣的:(Hadoop,hadoop,hdfs,big,data)