NDFS:在一系列机器上存储庞大的面向流的文件,包含多机的存储冗余和负载均衡。 文件以块为单位存储在NDFS的离散机器上,提供一个传统的input/output流接口用于文件读写。
块的查找以及数据在网络上传输等细节由NDFS自动完成,对用户是透明的。而且NDFS能很好地处理用于存储的机器序列,能方便地添加和删除一台机器。当某台机器不可用时,NDFS自动的保证文件的可用性。只要网上的机器序列能提供足够的存储空间,就要保证NDFS文件系统的正常运作。
NDFS是建立在普通磁盘上的,不需要RAID控制器或者其它的磁盘阵列解决方案。
语法
1). 文件只能写一次,写完之后,就变成只读了(但是可以被删除)
2). 文件是面向流的,只能在文件末尾加字节流,而且只能读写指针只能递增。
3). 文件没有存储访问的控制
所以,所有对NDFS的访问都是通过验证的客户代码。没有提供API供其它程序访问。因此Nutch就是NDFS的
模拟用户。
系统设计
NDFS包含两种类型的机器:NameNodes和DataNodes: NameNodes维护名字空间;而DataNodes存储数据块。NDFS中包含一个NamdNode,而包含任意多的DataNodes,每个DataNodes都配置与唯一的NameNode通信。
1)NameNode: 负责存储整个名字空间和文件系统的布局。是一个关键点,不能down掉。但是做的工作
不多,因此不是一个负载的瓶颈。
维护一张保存在磁盘上的表: filename-0->BlockID_A,BlockID_B...BlockID_X,etc.;
filename就是一字符串,BolockID是唯一的标识符。每个filename有任意个blocks。
2)DataNode:负责存储数据。一个块应该在多个DataNode中有备份;而一个DataNode对于一个块最多
只包含一个备份。
维护一张表:BlockID_X->array of bytes..
3)合作:DataNode在启动后,就主动与NameNode通信,将本地的Block信息告知NameNode。NameNode据此可以构造一颗树,描述如何找到NDFS中的Blocks。这颗树是实时更新的。DataNode会定期发送信息给NameNode,以证明自己的存在,当NameNode收不到该信息时,就会认为DataNode已经down了。
4)文件的读写过程:例如Client要读取foo.txt,则有以下过程。
a.Client通过网络联系NameNode,提交filename:"foo.txt"
b.Client收到从NameNode来的回复,包含:组成"foo.txt"的文件块和每个块存在的DataNode序列。
c.Client依次读取每个文件块。对于一个文件块,Client从它的DataNode序列中得到合适的DataNode, 然后发送请求给DataNode,由DataNode将数据传输给Client