赞
踩
Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上,具有高容错、高可靠性、高可扩展性、高吞吐率等特征,为超大数据集的应用处理带来了很多便利。HDFS不适合用在:要求低时间延迟数据访问的应用,存储大量的小文件,多用户写入或者任意修改文件的场景。
fsimage_
为前缀进行存储。edits_
为前缀进行存储。FSImage与Editlogs文件均存储在${dfs.namenode.name.dir}/current/
路径下。HDFS采用master/slave主从架构。一个HDFS集群由一个NameNode和一定数量的DataNode组成。
如上图所示,HDFS分布在三个机架上Rack1,Rack2,Rack3。
此时假设有一个文件FileA,大小为100MB,而HDFS的块大小为64MB。
a. Client向NameNode发送写数据请求,如上图蓝色虚线①
b. NameNode根据文件大小和文件块配置情况,将FileA按64MB分块成Block1和Block2;
c. NameNode节点根据DataNode的地址信息以及机架感知(rack-aware)策略返回可用的DataNode,如粉色虚线②。扩展:HDFS 机架感知
注:HDFS采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。默认情况下,副本系数是3(可通过dfs.replication进行修改)。HDFS的存放策略是将一个副本存放在本地机架的节点上,一个副本存放在同一机架的另一个节点上,最后一个副本存放在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略并不会影响到数据的可靠性和可用性。与此同时,因为数据块只存放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。
因此,返回的DataNode信息如下:网络拓扑上的就近原则,如果都一样,则随机挑选一台DataNode
Block1: host2,host1,host3
Block2: host7,host8,host4
d. client向DataNode发送Block1;发送过程是以流式写入。 流式写入过程如下:
1>将64MB的Block1按64KB的package划分;
2>然后将第一个package发送给host2;
3>host2接收完后,将第一个package发送给host1,同时client向host2发送第二个package;
4>host1接收完第一个package后,发送给host3,同时接收host2发来的第二个package。
5>以此类推,如图红线实线所示,直到将block1发送完毕。
6>host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。如图粉红颜色实线所示。
7>client收到host2发来的消息后,向namenode发送消息,说我写完了。这样就真完成了。如图黄色粗实线
8>发送完block1后,再向host7,host8,host4发送block2,如图蓝色实线所示。
9>发送完block2后,host7,host8,host4向NameNode,host7向Client发送通知,如图浅绿色实线所示。
10>client向NameNode发送消息,说我写完了,如图黄色粗实线。这样就完毕了。
读操作相对简单,如上图所示,FileA由block1和block2组成。此时client从DataNode读取FileA流程如下:
a. client向namenode发送读请求。
b. namenode查看Metadata元数据信息,返回FileA的block的位置。
Block1: host2,host1,host3
Block2: host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2。而且block1去host2上读取;然后block2,去host7上读取;
上面例子中,client位于机架外,那么如果client位于机架内某个DataNode上,例如,client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。
HDFS的读写流程感觉这里写的还不是很透彻,在贴几个博客地址:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。