大数据开发之Hadoop篇----hdfs写流程

1,客户端client调用DistributedFileSystem这个对象的create方法去和NameNode这个节点进行rpc通信,然后NameNode来检查create这个方法所传输过来的hdfs_path这个路径是否已经存在以及是否有这个权限在这个路径里创建文件,都没有问题的话就在这个路径下创建一个新的空文件,由于是空文件因此没有和任何block关联,同时返回一个FSDataOutputStream对象给client(这整个过程对于用户来说是完全透明的,我们并不知道发生了什么,我们只是使用了hdfs dfs -put file hdfs_path这个命令,而hdfs_path这个路径就是create里的那个路径参数)。如果路径无效就返回一个错误提示或者无权限创建都会返回错误异常。(因此第一步最终要的是从NameNode那里拿到一个FSDataOutputStream的对象)

2,client调用FSDataOutputStream对象的write方法将第一个块写给要存储的第一个DataNode(这里简称DN1),当第一个副本写入完成后,DN1将数据复制到DN2,当DN2写入完成后,DN2又将数据复制到DN3,当DN3也写入完成后,DN3将返回一个ack确认包给DN2,DN2受到DN3的ack确认包后,也返回一个ack确认包给DN1,当DN1受到来自DN2的ack确认包时就意味着DN3和DN2都完成写入了,这个时候DN1也返回一个ack确认包给FSDataOutputStream对象,这就标志着第一个数据块已完成所有副本的写入过程了。

接下来的数据块也是按照这个逻辑顺序继续执行下去的,直到最后一个数据块完成写入。

3,当整个文件完成写入后client调用FSDataOutputStream的close方法来关闭输出流,然后flush掉缓存区的数据包。

4,最后client再次调用FileSystem对象的complete方法告诉NameNode,文件完成写入流程了,同时记录一个editlog编辑日志文件。

这里我们再总结一下,就是client要写入的话首先要通过NameNode来确定写入的路径没有文件同时有权限写入新文件到指定路径,这样才能从NameNode那里获取到FSDataOutputStream这个输出流的对象。而client要将文件的数据块写入到DataNode就是要通过FSDataOutputStream对象的write方法来写入,而完成写入后client也是通过调用FileSystem对象的complete方法来告诉NameNaode写入完成。

所以我们可以理解为:FileSystem这个对象是client和NameNode进行沟通的对象,而FSDataOutputStream则是client和DataNode进行沟通的对象。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值