本文共 1413 字,大约阅读时间需要 4 分钟。
hdfs dfs -put 要上传的文件的路径 hdfs路径
通信管道
建立完成。hdfs dfs -get 本地路径 hdfs文件系统路径
1.首先调用 FileSystem.open()方法,获取到 DistributedFileSystem 实例
2.DistributedFileSystem向Namenode发起RPC(远程过程调用)请求获得文件的开始部分或全部block列表,对于每个返回的块,都包含块所在的DataNode 地址,这些DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离,然后再进行排序.如果客户端本身就是一个 DataNode,那么他将从本地读取文件,这样会确保只读一份文件而不会去读取所有备份,而且距离是最短的
3.Distributed FileSystem会向客户端client返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据。 FSDataInputStream包含一个DFSInputStream对象,这个对象用来管理DataNode和NameNode之间的I/O 4.客户端调用 read()方法,DFSInputStream 就会找出离客户端最近的datanode 并连接 datanode 5.DFSInputStream 对象中包含文件开始部分的数据块所在的 DataNode 地址,首先它会连接包含文件第一个块最近 DataNode。 随后,在数据流中重复调用 read()函数,直到这个块全部读完为止。如果第一个block块的数据读完,就会关闭指向第一个block块的datanode 连接,接着读取下一个block块 6.如果第一批block都读完了,DFSInputStream就会去NameNode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。 注意:read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode只是返回Client请求包含块的DataNode 地址,并不是返回请求块的数据。 最终读取所有的block会合并成一个完整的最终文件。
转载地址:http://bcjxi.baihongyu.com/