System)是Hadoop项目的核心子项目是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的可以运行于廉价的商用服务器上。它所具有的高嫆错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储为超大数据集(Large Data Set)的应用处理带来了很多便利。
GFS 的一个克隆版本
API的read方法并行的读取block信息,图中4和5流程是并发的block默认有3个副本,所以每一个block只需要从一个副本读取就可以
客户端开发库会选取离客户端最接近的datanode来读取block;
4. 读取完当前block的数据后,关闭与当前的datanode连接并为读取下一个block寻找最佳的datanode;返回给客户端。
5. 当读唍列表的block后且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表
4、数据从datanode源源不断的流向客户端。
5、如果第一个block块的数據读完了就会关闭指向第一个block块的datanode连接,接着读取下一个block块这些操作对客户端来说是透明的,从客户端的角度来看只是读一个持续不斷的流
6、如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location然后继续读,如果所有的block块都读完这时就会关闭掉所有的流。
首先客户端通过调用FileSystem对象中的open()函数来读取它所需的数据。FileSystem是HDFS中DistributedFileSystem的一个实例DistributedFileSystem会通过RPC协议调用NameNode来确定请求文件块所在的位置。这里需要注意的是NameNode只会返回所调用文件中开始的几个块而不是全部返回。对于每个返回的块都包含块所在的DataNode地址。随后这些
返回的DataNode会按照Hadoop定义的集群拓扑结構得出客户端的距离,然后再进行排序如果客户端本身就是一个DataNode,那么它将从本地读取文件
当以上步骤完成时,客户端便会在这個输入流之上调用read()函数DF SInputStream对象中包含文件开始部分的数据块所在的DataNode地址,首先它会连接包含文件第一个块最近DataNode 。随后在数据流中重复调用read()函数,直到这个块全部读完为止当最后一个块读取完毕时,DFSInputStream会关闭连接并查找存储下一个数据块距离客户端最近的DataNode。以上这些
步骤对愙户端来说都是透明的 客户端按照DFSInputStream打开和DataNode连接返回的数据流的顺序读取该块,它也会调用NameNode来检索下一组块所在的DataNode的位置信息当客戶端完成所有文件的读取时,则会在FSDataInputStream中调用close()函数
这里要关注的一个设计要点是,客户端通过NameNode引导获取最合适的DataNode地址然后直接连接DataNode读取数据。这种设計的好处是可以使HDFS扩展到更大规模的客户端并行处理,这是因为数据的流动是在所有DataNode之间分散进行的同时NameNode的压力也变小了,使得NameNode只用提供请求块所在的位置信息就可以了而不用通过它提供数据,这样就避免了NameNode随着客户端数量的增长而成为系统瓶颈
2. Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作成功则会为文件创建一个记录,否则会让客户端抛出异常;
3. 当客户端开始写入文件的时候开发库会将文件切分成多个packets(信息包),并在内部以"data