nutch中分布式文件系统介绍

dogstar 2008-05-29
NDFS:在一系列机器上存储庞大的面向流的文件,包含多机的存储冗余和负载均衡。
  文件以块为单位存储在NDFS的离散机器上,提供一个传统的input/output流接口用于文件读写。
  块的查找以及数据在网络上传输等细节由NDFS自动完成,对用户是透明的。而且NDFS能很好地处理
  用于存储的机器序列,能方便地添加和删除一台机器。当某台机器不可用时,NDFS自动的保证文件
  的可用性。只要网上的机器序列能提供足够的存储空间,就要保证NDFS文件系统的正常运作。
  NDFS是建立在普通磁盘上的,不需要RAID控制器或者其它的磁盘阵列解决方案。
  2.语法
  1). 文件只能写一次,写完之后,就变成只读了(但是可以被删除)
  2). 文件是面向流的,只能在文件末尾加字节流,而且只能读写指针只能递增。
  3). 文件没有存储访问的控制
  所以,所有对NDFS的访问都是通过验证的客户代码。没有提供API供其它程序访问。因此Nutch就是NDFS的
  模拟用户。
  3.系统设计
  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
  4.系统的可用性
  NDFS的可用性取决于Blocks的冗余度,即应该在多少个DataNode保持同一Block的备份。对于有条件的话
  可以设置3个备份和2个最低备份(DESIRED_REPLICATION and MIN_REPLICATION constants in fs.FSNamesystem)。
  当一个块的低于MIN_REPLICATION,NameNode就会指导DataNode做新的备份。
  5.net.nutch.fs包的一些文件介绍
  1)NDFS.java:包含两个main函数,一个是关于NameNode的,一个是关于DataNode的
  2)FSNamesystem.java:维护名字空间,包含了NameNode的功能,比如如何寻找Blocks,可用的DataNode序列
  3)FSDirectory.java:被FSNamesystem调用,用于维护名字空间的状态。记录NameNode的所有状态和变化,当
  NameNode崩溃时,可以根据这个日志来恢复。
  4)FSDataset.java: 用于DataNode,维护Block序列等
  5)Block.java and DatanodeInfo: 用于维护Block信息
  6)FSResults.java and FSParam.java: 用于在网络上传送参数等
  7)FSConstants.java:包含一些常数,用于参数调整等。
  8)NDFSClient.java:用于读写数据
  9)TestClient.java:包含一个main函数,提供一些命令用于对NDFS的存取访问
  6.简单的例子
  1)创建NameNode:
  Machine A:java net.nutch.fs.NDFS$NameNode 9000 namedir
  2)创建DataNode:
  Machine B:java net.nutch.fs.NDFS$DataNode datadir1 machineB 8000 machineA:9000
  Machine C:java net.nutch.fs.NDFS$DataNode datadir2 machineC 8000 machineA:9000
  运行1,2步后,则得到了一个NDFS,包含一个NameNode和两个DataNode。(可以在同一台机
  的不同目录下安装NDFS)
  3)client端的文件访问:
  创建文件:java net.nutch.fs.TestClient machineA:9000 CREATE foo.txt
  读取文件:java net.nutch.fs.TestClient machineA:9000 GET foo.txt
  重命名文件:java net.nutch.fs.TestClient machineA:9000 RENAME foo.txt bar.txt
  再读取文件:java net.nutch.fs.TestClient machineA:9000 GET bar.txt
删除文件:java net.nutch.fs.TestClient machineA:9000 DELETE bar.txt
6.1 概述
Nutch抓取下内容之后就要开始对文件进行管理。Nutch分布式文件系统基础架构是Hadoop文件系统(正式的讲就是NDFS)。NDFS与Google的文件系系统GFS是类似的,在一系列机器上存储庞大的面向流的文件,包含多机的存储冗余和负载均衡。
在这个文件系统中,文件以块为单位存储在NDFS的离散机器上,提供一个传统的input/output流接口用于文件读写。块的查找以及数据在网络上传输等细节由NDFS自动完成,对用户是透明的。而且NDFS能很好地处理用于存储的机器序列,能方便地添加和删除一台机器。当某台机器不可用时,NDFS自动的保证文件的可用性。只要网上的机器序列能提供足够的存储空间,就要保证NDFS文件系统的正常运作。NDFS是建立在普通磁盘上的,不需要RAID控制器或者其它的磁盘阵列解决方案。
6.2 文件系统语法
1.      文件只能写一次,写完之后,就变成只读了(但是可以被删除)
2.      文件是面向流的,只能在文件末尾加字节流,而且只能读写指针只能递增。
3.      文件没有存储访问的控制
所以,所有对NDFS的访问都是通过验证的客户代码。没有提供API供其它程序访问。因此Nutch就是NDFS的模拟用户。
6.3 文件系统设计
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,则有以下过程。
1.      Client通过网络联系NameNode,提交filename:"foo.txt"
2.      Client收到从NameNode来的回复,包含:组成"foo.txt"的文件块和每个块存在的DataNode序列。
3.      Client依次读取每个文件块。对于一个文件块,Client从它的DataNode序列中得到合适的DataNode,然后发送请求给DataNode,由DataNode将数据传输给Client
6.4.系统的可用性
NDFS的可用性取决于Blocks的冗余度,即应该在多少个DataNode保持同一Block的备份。对于有条件的话可以设置3个备份和2个最低备份(DESIRED_REPLICATION and MIN_REPLICATION constants in fs.FSNamesystem)。当一个块的低于MIN_REPLICATION, NameNode 就会指导DataNode做新的备份。
6.5 MapReduce
Hadoop是Google MapReduce的一个Java实现。MapReduce 是Nutch中的分布计算层。它主要分为map 和Reduce 两步。输入和输出数据是包含一系列键-值对的文件。
在map 阶段,输入数据被分割成由各个节点处理的连续的块。用户使用的map 功能将每个原始数据处理成中间数据集。通过该分割功能,每个中间数据被发送到Reduce 节点。分割是一个典型的hash过程,所有等键值的中间数据都将被发送到一个Reduce 节点。例如,如果一个map 操作输出以URL 为键值的数据,那么通过哈希值的分割就会发送中间数据以及给定的URL到一个Reduce节点。
Reduce 节点将所有的输入数据进行排序,并使用一个提供给用户的Reduce函数输出已经排序的map,产生MapReduce过程的最终输出。所有带有给定键值的输入都将交由Reduce处理,即以URL 为健值的所有数据和URL 一起被传递给Reduce函数,并可能用于产生最终输出。
MapReduce系统非常十分健壮,即使在机器出现故障和应用程序错误时仍能正常运行。因此我们可以利用它运行上十,上百,甚至上千台机器上进行并行操作。
happy_fish100 2008-09-10
可以试试开源的分布式文件系统FastDFS,它解决了大容量存储和高并发访问的问题,纯C编写,代码量不到2万行。目前已提供了C/C++、Java和PHP的客户端API。
详情请参阅:http://www.csource.org/
google code:http://code.google.com/p/fastdfs/
sizhefang 2009-01-08
http://bbs.cnw.com.cn/viewthread.php?tid=133623
Global site tag (gtag.js) - Google Analytics