1.介紹
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