写流程:怎么将文件切割成块,上传到服务器html
读流程:怎么从不一样的服务器来读取数据块node
写流程服务器
图一oop
图二spa
写的过程当中:NameNode会给块分配存储块的位置,每次想要存储文件的时候都会在NameNode建立一个path,以后HDFSClient读取和写入数据都是先访问这个NameNode中的path去找从何处去下载文件或者上传文件到哪里,具体的NameNode怎么去分配块的存储位置根据的是图一的原则。.net
文件写流程的实例辅助理解:日志
假如咱们有一个文件test.txt,想要把它放到Hadoop上,执行以下命令:htm
引用对象
# hadoop fs -put /usr/bigdata/dataset/input/20130706/test.txt /opt/bigdata/hadoop/dataset/input/20130706 //或执行下面的命令
# hadoop fs -copyFromLocal /usr/bigdata/dataset/input/20130706/test.txt /opt/bigdata/hadoop/dataset/input/20130706
整个写流程以下:
第一步,客户端调用DistributedFileSystem的create()方法,开始建立新文件:DistributedFileSystem建立DFSOutputStream,产生一个RPC调用,让NameNode在文件系统的命名空间中建立这一新文件;
第二步,NameNode接收到用户的写文件的RPC请求后,谁偶先要执行各类检查,如客户是否有相关的创佳权限和该文件是否已存在等,检查都经过后才会建立一个新文件,并将操做记录到编辑日志,而后DistributedFileSystem会将DFSOutputStream对象包装在FSDataOutStream实例中,返回客户端;不然文件建立失败而且给客户端抛IOException。
第三步,客户端开始写文件:DFSOutputStream会将文件分割成packets数据包,而后将这些packets写到其内部的一个叫作data queue(数据队列)。data queue会向NameNode节点请求适合存储数据副本的DataNode节点的列表,而后这些DataNode以前生成一个Pipeline数据流管道,咱们假设副本集参数被设置为3,那么这个数据流管道中就有三个DataNode节点。
第四步,首先DFSOutputStream会将packets向Pipeline数据流管道中的第一个DataNode节点写数据,第一个DataNode接收packets而后把packets写向Pipeline中的第二个节点,同理,第二个节点保存接收到的数据而后将数据写向Pipeline中的第三个DataNode节点。
第五步,DFSOutputStream内部一样维护另一个内部的写数据确认队列——ack queue。当Pipeline中的第三个DataNode节点将packets成功保存后,该节点回向第二个DataNode返回一个确认数据写成功的信息,第二个DataNode接收到该确认信息后在当前节点数据写成功后也会向Pipeline中第一个DataNode节点发送一个确认数据写成功的信息,而后第一个节点在收到该信息后若是该节点的数据也写成功后,会将packets从ack queue中将数据删除。
在写数据的过程当中,若是Pipeline数据流管道中的一个DataNode节点写失败了会发生什问题、须要作哪些内部处理呢?若是这种状况发生,那么就会执行一些操做:
首先,Pipeline数据流管道会被关闭,ack queue中的packets会被添加到data queue的前面以确保不会发生packets数据包的丢失,为存储在另外一正常dataname的当前数据指定一个新的标识,并将该标识传送给namenode,以便故障datanode在恢复后能够删除存储的部分数据块;
接着,在正常的DataNode节点上的以保存好的block的ID版本会升级——这样发生故障的DataNode节点上的block数据会在节点恢复正常后被删除,失效节点也会被从Pipeline中删除;
最后,剩下的数据会被写入到Pipeline数据流管道中的其余两个节点中。
若是Pipeline中的多个节点在写数据是发生失败,那么只要写成功的block的数量达到dfs.replication.min(默认为1),那么就职务是写成功的,而后NameNode后经过一步的方式将block复制到其余节点,最后事数据副本达到dfs.replication参数配置的个数。
第六步,,完成写操做后,客户端调用close()关闭写操做,刷新数据;
第七步,,在数据刷新完后NameNode后关闭写操做流。到此,整个写操做完成。blog
读流程
文件读流程的实例辅助理解:
1 FileSystem经过RPC与NN通讯,NN返回该文件的部分或所有block列表(含有block拷贝的DN地址)。
2 选取举栗客户端最近的DN创建链接,读取block,返回FSDataInputStream。
1 当读到block结尾时,FSDataInputStream关闭与当前DN的链接,并未读取下一个block寻找最近DN。
2 读取完一个block都会进行checksum验证,若是读取DN时出现错误,客户端会通知NN,而后再从下一个拥有该block拷贝的DN继续读。
3 若是block列表读完后,文件还未结束,FileSystem会继续从NN获取下一批block列表。
参考连接:https://blog.csdn.net/zhang123456456/article/details/77882866,http://www.javashuo.com/article/p-gvaxkggm-gq.html;