HDFS读取和写入剖析

参考《hadoop权威指南》

读取

客户端通过DistributedFileSystem对象的open()方法打开希望读取的文件。

  1. 这个对象通过RPC(远程过程调用)调用namenode来确定文件的起始块位置

  2. DistributedFileSystem类返回一个FSDataInputStream输入流对象。

  3. 客户端对这个输入流调用read()方法,连接距离最近的文件中第一个块所在datanode。验证datanode中的校验和。

    如果检测到数据块有错误,向namenode报告已损坏的数据块和正在读的datanode。
    namenode标记这个数据块已损坏。
    安排这个数据块的一个副本复制到另一个datanode。
    删除已损坏副本。

  4. 读取数据。
    到达块末尾时,关闭与此datanode的连接,然后寻找下一个块的最佳Datanode

  5. 客户端读取完成,对输入流调用close方法。

写入

  1. 客户端通过DistributedFileSystem对象调用create()创建文件。

  2. DistributedFileSystem对namenode创建一个RPC调用,在文件系统命名空间创建一个文件,namenode执行检查(已存在,权限)

  3. DistributedFileSystem类返回一个FSDataInputStream输入流对象。
    输入流将数据分成数据包(分块),形成数据队列。
    DataStreamer挑选合适的一组datanode存放数据,称为一个管线。
    (默认)复本存放策略:
    1 客户端所在节点(客户端在集群外的话,随机选节点)
    2 不同于第一个节点的机架上
    3 同2机架的不同节点
    其他 随机

  4. 数据包和校验和流式传入管线中的节点

  5. 当datanode发生故障,关闭管线。
    在该数据块所在的其他datanode做个标识,发送给namenode。
    管线中删除故障datanode。
    数据包继续在管线中的正常namenode间发送。
    (副本量不足时,在另一个节点上创建新副本)

  6. 一个数据包写完后datanode通知客户端和namendoe,然后写下一个数据包。

  7. 都写完以后,通知namenode

  8. 客户端对数据流调用close方法

    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值