HDFS读写流程

HDFS写流程

写操作对操作者是无感知的。

 

 

 

  1. client调用FileSystem.create(file path)方法,去与NN进行 RPC 通信,check该路径的文件是否存在以及有没有权限创建该文件。假如ok,就创建一个新文件,但是不关联任何的block,nn根据上传的文件大小和副本数计算多少块,以及块存放的dn,最终将这些信息返回给客户端,则为FSDataOutputStream (红色为面试题)
  2. client调用FSDataOutputStream.write方法,将第一个副本写到第一个dn,写完写第二个副本,写完写第三个副本。当第三个副本写完,返回给ack packet给第二个副本的dn,然后第二个dn返回ack给第一个dn,第一个dn返回ack给FSDataOutputStream,标识第一个块。然后依次写剩余的块(对操作者来说是透明的)
  3. 向文件写入数据完成后,client调用FSDataOutputStream.close()方法,关闭输出流,flush缓存区的数据包;
  4. 再调用FSDataOutputStream.complete(),通知nn节点写入成功。

 

HDFS读流程

 

  1. client端通过FileSystem.open(filepath) ,去与nn进行rpc通信,返回该文件的部分或全部的block块列表,也就是返回FsData InputStream对象
  2. client调用FsData InputStream对象的read()方法,a)去与第一个块的最近的DN进行read,读取完后会check。假如success,会关闭与当前dn通信。假如fail,会记录失败的dn+block信息,下次就不会读取;那么会去该块的第二个dn的地址读取。b)然后去第二个块的最近的dn上读取,重复check;c)假如当前block列表全部读取完成,文件还没有结束,那么FileSystem会从nn获取下一批的列表(对操作者透明,无感知,感觉就是连续的数据流)
  3. Client调用FsDataInputStream.close() 关闭输入流

副本放置策略

 

生产上,尽量将读写的动作 选取dn节点

【面试题】集群DN 3个,其中一个DN挂了,那么一个文件三个副本,那么我现在能够正确读取文件内容吗?(block miss,该如何修复?)

  1. 手动修复  https://blog.csdn.net/high2011/article/details/72461376
  2. 自动修复  https://www.cnblogs.com/prayer21/p/4819789.html

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值