Nutch搜尋引擎之Distributed File System

來源:互聯網
上載者:User

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 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.