HDFS读写流程

一、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块。

转载于:https://www.cnblogs.com/tkzm/p/11400639.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值