Hadoop分布式文件系統(HDFS)被設計成適合運行在通用硬件(commodity hardware)上的分布式文件系統。它和現有的分布式文件系統有很多共同點。但同時,它和其他的分布式文件系統的區別也是很明顯的。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS放寬了一部分POSIX約束,來實現流式讀取文件系統數據的目的。HDFS在最開始是作為Apache Nutch搜索引擎項目的基礎架構而開發的。HDFS是Apache Hadoop Core項目的一部分。
HDFS有著高容錯性(fault-tolerant)的特點,并且設計用來部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)來訪問應用程序的數據,適合那些有著超大數據集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以實現流的形式訪問(streaming access)文件系統中的數據。
全稱 | Hadoop Distributed File System | 簡稱 | hdfs |
---|---|---|---|
實質 | 分布式文件系統 | 作用 | 作為Apache Nutch的基礎架構 |
特點 | 高容錯性 | 適用 | 大規模數據集 |
HDFS是什么?
HDFS 全稱 Hadoop Distributed File System ,簡稱HDFS,是一個分布式文件系統。它是谷歌的GFS提出之后出現的另外一種文件系統。它有一定高度的容錯性,而且提供了高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS 提供了一個高度容錯性和高吞吐量的海量數據存儲解決方案。
優點
1、存儲超大文件
2、標準流式訪問:“一次寫入,多次讀取”
3、運行在廉價的商用機器集群上
不足
1、不能滿足低延遲的數據訪問
2、無法高效存儲大量小文件
3、暫時不支持多用戶寫入及隨意修改文件
HDFS概念理解
hdfs架構圖如下:
1、文件塊(圖中1、2、3、4帶顏色的小正方形)
文件分成塊存儲(默認64M,如今版本是128是M),多臺計算機存儲。DateNode中存儲以數字編號的方塊(見上圖)用于備份,每個塊都會復制到幾臺機器上(默認3臺),如果一個塊不可用,可從其它地方讀取副本。副本是3,表示一共3處有該塊。如果配置文件中副本設置為 4 ,但是結果只有2臺datanode,最后副本還是2
1000個1M的小文件會占用1024個塊和1024個 inode,但是他只是占用1個塊中的1M,不會占用整個空間,不過由于inode存儲在NameNode的內存里,如果NameNode內存不足以存儲inode,那么就不能再存儲文件了、所以說HDFS并不適合存儲小文件,有時候還要將小文件合并為大文件。
顯示塊信息命令:
hdfs fsck / -files –blocks //列出根目錄下各個文件由哪些塊存儲。
//它只是從NameNode獲取信息,不與DateNode交互。
2、 NameNode和DataNode
NameNode(名字節點): 管理文件系統命名空間;維護文件系統樹內所有文件和目錄,記錄每個文件在哪個DateNode的位置和副本信息,協調客戶端對文件的訪問。 以兩種文件格式存在:
fsimage_*:元數據鏡像文件,即系統的目錄樹,包括文件目錄和inodes元信息(文件名,文件大小,創建時間,備份級別,訪問權限,block的size,所有block的構成),每個inode是hdfs的一個代表文件或者目錄的元數據。這個鏡像文件相當于hdfs的元數據額數據庫文件。
edits_*:編輯日志文件,也就是事務日志文件,也就是針對文件系統做的修改操作記錄,記錄元數據的變化,相當于操作日志文件。一個文件的創建,追加,移動等。 NameNode內存中存儲的是=fsimage+edits 檢查點:NameNode啟動時,從磁盤中讀取上面兩種文件,然后把edits_*里面記錄的事務全部刷新到 fsimage_*中,這樣就截去了舊的edits_*事務日志,這個過程叫checkpoint。
上面文件在~/hadoop-2.6/dfs/name/current目錄下(在hdfs-site.xml) ,除此之外,還有VERSION(版本信息,包含文件系統唯一標識符)和seen_txid(事務管理,里面保存一個整數,表示edits_*的尾數)兩個文件。
DataNode(數據節點):存儲,檢索數據塊。定期向NameNode發送所存儲的塊的列表。存儲的塊大小是64M,并且盡量把數據塊分布不同的DateNode節點上。
上圖某文件被分成4塊,在多個DataNode中存儲,而且每塊都復制兩個備份,存儲在其它DataNode中。這些數據的存儲目錄/home/hduser/hadoop-2.6/dfs/data(dfs-site.xml中指定)。例如下面文件:/home/hduser/hadoop-2.6/dfs/data/current/BP-1111-ip-2222/current/finalized/subbdir0/sudir0,該目錄下的文件包括blk_{id}和blk_{id}.meta,前者是二進制格式的數據塊,后者是數據塊的元信息(版本信息,類型信息 )
DataNode負責處理文件系統客戶端的文件讀寫請求,并在NameNode的統一調度下進行數據的創建,刪除和復制工作。如果NameNode數據損壞,HDFS所有文件都不能訪問,為了保證高可用性,Hadoop對NameNode進行了補充,即Sencondary NameNode。
3、 Secondary NameNode結點
系統同步運行一個Secondary NameNode,也稱二級NameNode,周期的備份NameNode,它可以用來恢復NameNode。由于有一定的滯后,所以會帶來數據的損失。為了防止宕機,一般我們會把它放在另外一臺計算機。使用hdfs-site.xml中dfs.namenode.secondary.http-address屬性可以通過瀏覽器查看Secondary NameNode的運行狀態。 默認是1小時,從NameNode獲取fsimage和edits進行合并,然后再發送給namenode,減少namenode的工作量。
HDFS體系架構
HDFS采用master/slave架構。一個HDFS集群是由一個Namenode和一定數目的Datanodes組成。Namenode是一個中心服務器,負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問。集群中的Datanode一般是一個節點一個,負責管理它所在節點上的存儲。HDFS暴露了文件系統的名字空間,用戶能夠以文件的形式在上面存儲數據。從內部看,一個文件其實被分成一個或多個數據塊,這些塊存儲在一組Datanode上。Namenode執行文件系統的名字空間操作,比如打開、關閉、重命名文件或目錄。它也負責確定數據塊到具體Datanode節點的映射。Datanode負責處理文件系統客戶端的讀寫請求。在Namenode的統一調度下進行數據塊的創建、刪除和復制。 一次寫,多次讀?。阂粋€文件一旦創建,寫入,關閉之后就不需要修改了。
讀寫流程如下: 讀流程:客戶端向NameNode請求訪問某個文件,NameNode返回該文件位置在哪個DataNode上,然后客戶端從DataNode上讀取數據。 寫流程:客戶端向NameNode發出寫文件寫請求,NameNode告訴客戶端向哪個DataNode寫文件,然后客戶端將文件寫入該DataNode節點,隨后該 DataNode將該文件自動復制到其它DataNode節點上,默認三份備份。
HDFS常見節點管理:1 節點添加 可擴展性是一個重要特征,往HDFS集群中添加一個節點步驟如下:
1) 對新節點進行系統配置(hostname,hosts,jdk,防火墻等)
2) 對新節點進行hadoop的安裝和配置,和其它DataNode一樣。
3) 在NameNode中修改~/hadoop-2.6/etc/hadoop/Slaves文件,加入新節點名稱。
4) 啟動(start-all.sh,或者start-dfs.sh,start-yarn.sh)
2 負載均衡 HDFS的數據在各個DataNode中的分布可能不均勻,尤其是DataNode出現故障或者新增節點時,采用下面命令可以重新平衡DataNode的數據塊分布: $start-balancer.sh
3 安全機制 由于NameNode統一調度,沒有它文件系統無法使用,采用下面兩種機制確保其安全:
1) 把NameNode存儲的元數據轉移到其它文件系統上。
2) 使用Secondary NameNode同步備份。
加米谷大數據是一家專注于大數據培訓的機構,提供個人培訓和企業內訓;如果您是0基礎學習大數據或者轉行大數據行業,歡迎實地了解考察!
本書以云計算與大數據基礎開篇,簡單介紹了分布式文件系統HDFS與NoSQL數據庫技術,重點對分布式計算框架MapReduce、Hadoop技術、云數據中心、大數據與數據挖掘技術進行了闡述。 2100433B