当前位置:   article > 正文

HDFS读写数据流程(详解)_简述 hdfs 数据的读取和写入过程。

简述 hdfs 数据的读取和写入过程。

HDFS写数据流程

  1. 客户端通过DistributedFileSystem模块向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步)

流水线复制
       当客户端向 HDFS 文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副 本系数设置为 3 ,当本地临时文件累积到一个数据块的大小时,客户端会从 Namenode 获取一个 Datanode 列表用于存放副本。然后客户端开始向第一个 Datanode 传输数据,第一个 Datanode 一小部分一小部分 (4 KB) 地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中 第二个 Datanode 节点。第二个 Datanode 也是这样,一小部分一小部分地接收数据,写入本地 仓库,并同时传给第三个 Datanode 。最后,第三个 Datanode 接收数据并存储在本地。因此, Datanode 能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的 方式从前一个 Datanode 复制到下一个 .
 

机架感知:

http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data%20Replication

副本的放置对HDFS的可靠性和性能至关重要。机架感知副本放置策略的目的是提高数据可靠性、可用性和网络带宽利用率。

大型HDFS实例运行在通常分布在多个机架上的计算机集群上。不同机架上的两个节点之间的通信必须通过交换机。在大多数情况下,同一机架中的计算机之间的网络带宽大于不同机架中的计算机之间的网络带宽。

NameNode通过中确定每个DataNode所属的机架id,一个简单但非最佳的策略是将副本放在唯一的机架上。这可以防止整个机架发生故障时丢失数据,并允许在读取数据时使用多个机架的带宽。此策略在群集中均匀分布副本,这使得在组件故障时很容易平衡负载。但是,此策略会增加写入成本,因为写入操作需要将块传输到多个机架。

HDFS默认放置策略是将一个副本放在本地机架的一个节点上,另一个副本放在本地机架的不同节点上,最后一个副本放在不同机架的不同节点上。

  • 此策略可减少机架间的写入流量,从而提高写入性能。机架故障的概率远小于节点故障的概率;
  • 此策略不影响数据可靠性和可用性保证。但是,它确实减少了读取数据时使用的总网络带宽,因为一个块只放在两个唯一的机架中,而不是放在三个机架中。
  • 使用此策略,文件的副本不会均匀分布在机架上。三分之一的副本位于一个节点上,三分之二的副本位于一个机架上,另外三分之一的副本均匀分布在其余机架上。
  • 此策略在不影响数据可靠性或读取性能的情况下提高了写入性能。

 

HDFS读数据流程 

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

DataNode工作机制

  1.  一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块长度,块数据的校验和,以及时间戳。
  2. DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
  3. 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10min没有收到某个DataNode的心跳,则认为该节点不可用。
  4. 集群运行中可以安全加入和退出一些机器。

 数据完整性

 当DataNode读取Block的时候,它会计算CheckSum。如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。Client读取其他DataNode上的Block。DataNode在其文件创建后周期验证CheckSum,如图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/741565
推荐阅读
相关标签
  

闽ICP备14008679号