HDFS读写流程

HDFS写流程

在这里插入图片描述
HDFS写流程:

  1. HDFS Client (基于JVM)调用 Distributed FileSystem.create方法,将文件路径传给NameNode,并与NameNode进行 RPC 通信。然后 NameNode 去check该路径这个文件是否已经存在,并check 是否有权限操作。如果OK,就创建一个新的文件,但是不关联任何 block 块(这时并没有真正地写)。NN根据上传的文件大小及副本数,计算出需要多少块以及块存放的 DN ,最终将这些信息返回给client node,形成FSData OutputStream 对象。
  2. 调用FSData OutputStream.write()方法,将第一个块的第一个副本写到第一个DN,写完写第二个副本,写完写第三个副本 。当第三个副本写完以后,将ack pacage(ack确认包)返回给第二个副本的DN,然后第二个副本的DN返回ack确认包给第一个副本的DN,然后第一个副本的DN返回ack确认包给FSData OutputStream对象,标识第一个块的三个副本写完了。开始写第二个块的三个副本。
  3. 当向文件写入数据完成后,client端调用FSData OutputStream的close()方法,关闭输出流,flush 缓存区的数据包
  4. 再调用Distributed FileSystem.complete()方法,告诉NN写入成功。
    (写的这个过程,用户是看不见的。)

HDFS读流程

  1. Client通过Stributed FileSystem.open(filepath),去与NN进行RPC通信,返回该文件的部分或者全部block列表,也就是返回FSData InputStream 对象;
  2. Client 调用 FSData InputStream.read()方法
    a. 去与第一个块的最近的DN进行read,读取完后,会check:
    假如success,会关闭与当前DN通信;
    假如fail,会记录失败的DN + block信息,下次就不会读取,那么会去该块的第二个DN的地址读取;
    b. 然后去第二个块进行操作。
    c.假如当前block列表全部读取完成,文件还没结束,那么FileSystem 会继续从NN上获取block列表。这些是对用户透明的,用户感觉是连续的。
  3. Client调用FSData InputStream.close(),关闭输入流
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值