码迷,mamicode.com
首页 > 其他好文 > 详细

HDFS读写流程

时间:2019-08-23 16:18:07      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:负载   image   行数据   hadoop2   col   hadoop   访问   列表   注意   

一、HDFS中的block、packet、chunk

1.Block

 在将文件上传到hdfs之间需要分块,这个块就是block,默认为128MB(hadoop2.X),当然可以更改。通过修改core-default.xml文件修改这个值,它是最大的一个单位。

2.Packet

  Packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传输数据的基本单位,默认是64kb。

3.Chunk

 Chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认为512B,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk的大小为516B。由此可见真实数据与校验值的比值约为128:1

二、HDFS中的写流程

技术图片

  1. 客户端通过RPC(远程服务)访问NameNode,请求写入一个文件。
  2. NameNode检查客户端是否有权限写入,如果有权限返回一个响应。如果没有客户端就会抛出一个异常。
  3. 客户端会将文件按BlckSize大小(默认128M)将文件切分成若干个Block块,然后请求写入第一个Block块。
  4. NameNode会根据它的负载均衡机制,给客户端返回满足其副本数量(默认是3)的列表(BlockId:主机,端口号,存放的目录)。
  5. 客户端根据返回的列表,开始建立管道(pipline)。(管道连接方向:客户端->第一个节点->第二个节点->第三个节点)
  6. 开始传输数据,Block按照Packet传输,当一个Packet成功传输到第一个DataNode上以后,第一个DodaNode就把这个Packet进行复制,并将这个Packet通过管道传输到下一个DataNode上,下一个DataNode接收到Packet后,继续进行复制,再传输到下一个DataNode上。
  7. 当一个Block块成功传输完以后,从最后一个DataNode开始,依次从管道返回ACK队列,到客户端。
  8. 客户端会在自己内部维护着一个ACK队列,跟返回来的ACK队列进行匹配,只要有一台DataNode写成功,就认为这次写操作是完成的。
  9. 开始进行下一个Block块的写入。重复步骤3-8。

 注意:

        如果在传输的时候,DataNode宕机了,这个DataNode就会从这个管道中退出。剩下的DataNode继续传输。然后,等传输完成以后,NameNode会再分发出一个节点,去写成功的DataNode上复制出一份Block块,写到新的DataNode上。

 三、HDFS中的读流程

 技术图片

  1. 客户端通过RPC向NameNode发送读请求。
  2. NameNode确认客户端是否有读权限,如果有,给客户端返回一个响应,如果没有,客户端抛出一个异常。
  3. 客户端向NameNode请求需要读取的文件。
  4. NameNode返回存储此文件的每个Block块所在的位置的列表。
  5. 客户端会从返回的列表中挑选一台最近的,建立连接,读取Block块。读取的时候会将Block块统计目录下的校验信息,一起读取过来。
  6. 客户端读取完Block块信息以后,会计算出一个校验和跟读取过来的校验和进行对比,如果能匹配上,就说明正确。如果匹配不上,就从其他节点上读取Block块。

HDFS读写流程

标签:负载   image   行数据   hadoop2   col   hadoop   访问   列表   注意   

原文地址:https://www.cnblogs.com/tkzm/p/11400639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!