HDFS写数据流

 大部分hdfs程序对文件操作采用" 一次写多次读取”的模式

写数据过程:

简述:客户端先通知nn节点:我要写文件了,确认客户端权限和没有相同的文件以后,nn节点创建一个新的文件记录;然后把文件分成一个一个的数据块(默认大小64mb)通过文件流的方式向dn节点中写数据,写数据的时候,注意是会写冗余数据,冗余数据块默认三个;最后,只有冗余数据块全部写完,dn节点再向客户端发出确认,然后客户端向nn节点发出结束消息,并将文件的块信息存储在nn节点里面。

1:客户端调用分布式文件系统(DistributedFile System)对象中的create()创建一个文件。DistributedFileSystem会通过rpc调用的名称节点name node)中的文件系统命名空间创造一个新的文件。

2:nn节点通过多种验证,确保请求客户端拥有创建文件的权限,新的文件不存在文件系统中。当所有的验证通过以后吗,nn节点就会创建一个新文件的记录。

如果创建失败的话,就会显示IOException异常。

如创建成功,那分布式文件系统就返一个文件系统数据输出流(FSDataOutputStream)给客户端用来写数据。这时FSDataOutputStream包含了一个数据流对象DFSDataOouputStream,客户端将使用它来处理dn节点和nn节点之间的通信。

3:客户端调用FSDataOutputStream的write()函数向对应的文件写入数据。

4:客户端开始写入数据的时候,DFSDataOouputStream会把文件分割成一个一个的包,然后把这些包放到一个内容”数据队列“里面,数据流系统(DataStreamer)会把这些小的文件放到数据流里面,DataStreamer是用来请求nn节点为新的文件包分配合适的dn节点存放副本。返回的dn节点形成了一个"管道",如果这里的副本有三个,那这个管道里面就有3个dn节点把文件包用流的方式传给队列里面的第一个dn节点。第一个dn节点会存储这个包,在把它推送到第二个dn节点,依次重复操作,直达完成“数据流管道”里面的最后一个dn节点。

5:DFSDataOouputStream同时也会保存一个包的内部队列,用来等待“管道”中的dn节点返回确认信息,这个队列被叫做“确认队列”。只有管道里面所有的dn节点都返回写入成功的信息后,才会从确认队列中的删除。

       当数据写入失败的节点失败是,hdfs会做出一下反应,首先会关闭“数据流管道”,任何在确定通知队列的文件包都会被添加到“数据队列”的前端,这样管道中失败的dn节点的数据不会丢失。

当前存放在正常工作dn节点上面的文件块会被给到一个新的身份,并且跟nn节点进行关联,这样如果失败的dn节点过段时间从故障中恢复过来,其中的部分数据块就会被删除,然后“数据流管道”就把失败的dn节点删除,文件会继续被写道到“数据流管道”的另外两个dn节点中,最后nn节点会注意到现在的文件块副本没有到达配置属性,会在另外的dn节点上安排创建一个副本,然后的文件就正常执行写入操作。

6:当客户端成功完成数据写入的操作以后,调用FSDataOutputStream的close()方法,把所有的数据块写入数据流管道里面的dn节点,并等待确认返回成功,最后通过nn节点完成写入。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值