hdfs写数据流程

 

上面图看不懂没关系,下面我有简单语言说明下其过程。

现在客户端要上传一个300M的文件。

1客户端先请求namenode,告诉namenode我有上传一个叫作cls_初解禁的文件。

2namenode检查元数据中是否有这个文件,有就告诉客户端这个文件已存在,没有就告诉客户端你可以上传了

3客户端收到namenode可以上传的消息,这个时候客户端将300M切片,将第一个black(128M)和副本数n(3),告诉namenode.

4namenode收到客户端信息,选择3个datanode给客户端(dn1,dn3,dn4)

datanode的选择(空间/网络距离)这里是3个副本的情况

  1. 先选择最近的datanode(dn1)给客户端
  2. 在选择一个跨机架的datanode(dn3)给客户端,为什么要这样?是怕如果datanode都在同一个路由器(同机架)下,如果路由器坏了,就备份文件失效了,这是个可靠性的问题。
  3. 选择一个和第一个datanode(dn1)同机架的datanode(db4)给客户端。

5客户端收到来自namenode的datanode列表(有序的列表),选择第一个datanode(dn1),发出建立通道请求,并将列表发给db1。

6 dn1收到客户端的通道请求和列表,这个时候dn1先没直接回复客户端,而是根据列表(有序)项db3发出建立通道请求。并将列表中dn1的状态标记改变(我猜的)

7重复6的步骤,dn3向db4发出建立通道请求。并将列表中dn3的状态标记改变(我猜的)

8dn4收到db3的建立通道请求,并发现列表中没有其他datanode了(不要向其他datanode建立通道请求),这个时候dn4回复dn3,我答应建立通道了,dn3收到回复,向dn1回复,我也答应建立通道了,dn1就告诉客户端,我答应建立通道了。这样客户端请求的通道就全部建立好了。

注意:即使dn3或者db4因为其他原因不能建立通道也没关系,只要dn1能和客户端建立通道就行,因为后期datanode会和namenode保持通讯(间隔时间,副本拷贝)。

8客户端收到消息,已经能和dn1正常通讯了。将第一个black(128M)拆分为多个packet(64K),顺序发送给db1

9db1收到package,将它放到缓冲池(byteBuffer)里面,校验packet,校验成功后,将packet存入本地文件系统中,并将packet发给db3

10 dn3重复9的工作。

11 客户端将第一128M(black)发送完了。现在要发送第二个black,这个时候客户端重复3到10的步骤,直到将文件上传完。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值