- 特點:
- 一次寫入,多次讀取(write-once-read-many),降低併發要求控制,監護數據聚合性,支持高吞吐量;
- 將處理邏輯放置到數據附近(比將數據移向應用程序空間更好)
- 數據寫入嚴格限制爲,一次一個寫入程序。字節被附加到流的末尾,字節流總以寫入順序存儲
- HDFS的應用層序幾口:
HDFS提供了一個原生的Java應用程序接口(API)和一個針對這個Java API的原生C語言
封裝器。另外可以使用web瀏覽器瀏覽HDFS文件
- FileSystem(FS) shell:命令行接口,支持與數據進行交互;
- DFSAdmin:管理一個HDFS集羣命令集;
- fsck:Hadoop命令/應用程序的一個子命令,用來檢查文件的不一致,但不能更正不一致;
- Name Node和 Data Node:擁有內置web服務器,允許管理員檢查集羣的當前狀態
- HDFS架構:
HDFS由互連的節點集羣組成,文件和目錄駐留在節點上。一個HDFS集羣包含一個節點,即
Name Node,用來管理文件系統名稱空間並規範客戶端對文件的訪問。 Data Node將數
據作爲塊存儲在文件中。
-
Name Node和Data Node:
管理一些文件系統名稱空間操作,比如:打開、關閉、以及重命名文件和目錄。Name Node還將數據塊映射到Data Node上,處理來自HDFS客戶端的讀寫請求。Data Node還根據Name Node的指令創建、刪除和恢復數據塊。
-
Name Node和Data Node之間的關係:
兩者是一些軟件的組件,以解耦方式跨多個異構操作系統在普通的PC上運行。HDFS是使用Java語言構建的,因此任何支持Java片編程的機器都能運行HDFS。一個典型的安裝集羣擁有一臺專用機器運行NameNode,可能還有一個Data node,集羣中其他每臺機器上運行一個d=Data Node。
Data Node持續循環,詢問Name Node指令。Name Node不能直接連到Data Node,只是從Data Node調用函數返回值。每個Data Node都維護一個開放的服務器套接字,以便客戶端代碼或其他Data Node能夠讀寫數據。Name Node知道這個服務器的主機或者端口,將信息提供給相關客戶端或Data Node
所有HDFS通信協議都構建於TCP/IP協議之上。HDFS客戶端連接到Name Node上打開一個Transmission Control Call(TCP)端口,然後使用一個基於Remote Procedure Call(RPC)的專有協議與Name Node通信。Data Note使用一個基於塊的專有協議與Name Node通信 -
文件系統名稱空間
HDFS支持傳統的層級式文件結構,用戶或應用程序可以在其中創建目錄和保存文件,層級類似於現有大多數文件系統;另外HDFS還支持第三方文件系統,比如CloudStore和Amazon SimpleStorage Service
數據複製:
HDFS複製文件以便容錯;在文件創建時指定文件的副本數,也可以隨時更改。由Name
Node負責。
-
HDFS使用智能副本放置模型提高可靠性和性能;高效使用網絡寬帶的,具有機櫃意識的副本放置策略能促進優化。
機櫃意識:通常,大型HDFS集羣跨多個安裝點排列,一個安裝中的不同節點之間的網絡流量通常比跨安裝點的網絡流量更高效。一個NameNode儘量將一個塊的多個副本放置到多個安裝上以提高容錯能力。但是,HDFS允許管理員決定一個節點屬於哪個安裝點。因此,每個節點都知道它的機櫃ID,即機櫃意識。
-
不同安裝點中的兩個Data Node之間的通信比一個安裝點中的兩個Data Node之間的通信緩慢,Name Node試圖根據機櫃ID對Data Node進行優化。
數據組織:
HDFS的一個主要目標是支持大文件。一個典型的HDFS塊的大小爲64MB。因此,每個HDFS
文件包含一個或多個64MB塊,將每個塊都放置在獨立的DataNode上。
-
文件創建過程
在HDFS上操作文件與其他文件系統類似,但由於HDFS是一個顯示爲單個磁盤的多機器系統,所有操作HDFS上的文件代碼都是用org.apache.hadoop.fs.FileSystem對象的一個子集。
-
提交
當一個客戶端在HDFS上創建一個文件是,首先將數據緩存到一個臨時本地文件中,然後將後續寫入的數據重定向到這個臨時文件中。當臨時文件積累的數據足以填充一個HDFS塊時,客戶端向Name Node報告,Name Node將文件轉換爲一個永久Data Node。然後客戶端關閉臨時文件,並將剩餘的數據注入新創建的Data Node。Name Node然後將Data Node提交到磁盤。 -
複製管道化
當客戶端積累了一個完整的用戶數據塊時,它將從Name Node檢索包含那個塊的副本的Data Node的列表。然後,客戶端將整個數據塊注入這個副本列表中指定的第一個Data Node。當Data Node接收數據塊時,它將數據塊寫入磁盤,然後將副本轉移到列表的下一個Data Node。管道化過程不斷重複,直到複製因子被滿足。
數據存儲可靠性
HDFS的一個主要目標是可靠存儲數據,即使在Name Node、Data Node或網絡分區出現
故障,HDFS可以通過心跳消息探測Name Node和Data Node之間的聯通性。
-
HDFS心跳:
在一些情況下,Name Node和Data Node之間會喪失聯通性。每個Data Node都會定期向Name Node發送心跳信息。如果Name Node不能接收心跳信息,說明Data Node已經死亡,並對此節點標記爲死亡Data Node,將來不會向該節點發送請求,並從系統中移除,如果該節點的減少會影響一些數據的複製因子的最小數,則Name Node將啓動附加複製,將複製因子帶回正常狀態。
-
數據塊再平衡(保證數據完整性機制):
集羣中新增Data Node時需要再平衡,需考慮:塊副本寫入策略;阻止安裝或機櫃故障導師的數據丟失;減小跨安裝網絡IO,跨集羣中的Data Node的同一數據分佈。 -
數據完整性:
HDFS在文件的內容上使用checksum驗證,將計算的checksum保存在實際數據所在的名稱空間中的獨立隱藏文件裏,當客戶端檢索文件數據時,驗證收到的數據是否匹配關聯文件中存儲的checksum。
HDFS名稱空間通過每個 Name node 保存的一個事務日誌存儲。文件系統名稱空間,以及文件塊映射和文件系統屬性,一併保存在一個名爲 FsImage 的文件中。當一個 Name node 初始化時,它讀取 FsImage 文件以及其他文件,並應用這些文件中保存的事務和狀態信息。 -
同步元數據更新
Name node 使用一個名爲 EditLog 的日誌文件持久記錄對 HDFS 文件系統元數據發生的每個事務。如果 EditLog或 FsImage 文件損壞,它們所屬的 HDFS 實例將無法正常工作。因此,一個 Name node 支持多個 FsImage 和 EditLog 文件副本。對於這些文件的多個副本,對任一文件的任何更改都將同步傳播到所有副本。當一個 Name node 重新啓動時,它使用 FsImage 和 EditLog 的最新統一版本來初始化自身 -
HDFS 的用戶、文件和目錄權限:
HDFS 對文件和目錄實現了一個權限模型,這個模型與 Portable Operating System Interface (POSIX) 模型有很多共同點;例如,每個文件和目錄都關聯到一個所有者和一個組。HDFS 權限模型支持讀取(r)、寫入(w)和執行(x)權限。由於 HDFS 中沒有文件執行這個概念,x 權限的含義不同。簡言之,x 權限表明可以訪問一個給定父目錄的一個子目錄。一個文件或目錄的所有者是創建它的客戶端進程的身份。組是父目錄的組。
參考文獻
https://www.ibm.com/developerworks/cn/web/wa-introhdfs/