Hadoop理论——hdfs读、写流程

在Hadoop中我们一定会使用hdfs的传输,那么,hdfs的读写流程究竟是什么,我利用了一点时间整理了一下
首先就是官网的图,介绍了HDFS

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进行沟通的对象。
hdfs读流程
读流程所涉及到的有client,NameNode和DataNode这个三个,我们来了解下这三个之间在读流程里都是干什么的。

1,当我们输入一条读入数据的命令的时候,如:hdfs dfs -ls / 或者 hdfs dfs -cat /user/hadoop/xxx时,client就通过DistributedFileSystem这个对象的open方法去和NameNode进行rpc通信,其中open方法会将一个path路径传递过去,这个path路径就是我们要查看的文件或者文件夹的路径。NameNode会对这个path进行交验,判断是否存在这个路径以及你要读取的路径你是否拥有权限去读取,如果都没问题的话就接着第二步,否则报错。

2,交验完成后返回一个FSDataInputStream对象,当要读取前client还要向NameNode发送一次请求,然后NN将会返回要读取的文件的全部或者一部分block列表,这些就是blockmap的内容嘛,还记不记得前几篇的有介绍到hdfs的写流程,其中说到DataNode会返回心跳包给NameNode以及每隔10个心跳包就会返回一个blockmap给NameNode,里面就记录了每个文件所对应的block以及其存储的节点位置。

3,client调用FSDataInputStream对象的read方法去读取每一个block最近地址的副本(虽然有多个副本但是并不是要读取全部副本的,所以会根据一个算法来读取离client最近节点上的副本),读取完成后回去交验这个block是否有损坏,假如没有任何问题会自动关闭与当前DataNode的通信。如果check失败了,会记录下这个受损的block在哪个DataNode节点上,下次不会再读取了。

4,然后就是下个block的读取,当我们把block列表里面的block读取完后,文件还没有结束将继续向NameNode申请下一批block列表。

5,最后client调用FSDataInputStream对象的close方法关闭输入流。

作者:簡箪
来源:CSDN
原文:https://blog.csdn.net/weixin_43267534/article/details/83901175
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/liuSC123/article/details/84062614
今日推荐