HDFS前言
HDFS:Hadoop Distributed File System ,Hadoop分布式文件系統,主要用來解決海量數據的存儲問題
設計思想
1、分散均勻存儲 dfs.blocksize = 128M
2、備份冗余存儲 dfs.replication = 3
在大數據系統中作用
為各類分布式運算框架(如:mapreduce,spark,tez,……)提供數據存儲服務。
重點概念
文件切塊,副本存放,元數據
HDFS的概念和特性
概念
首先,它是一個文件系統,用於存儲文件,通過統一的命名空間——目錄樹來定位文件
其次,它是分布式的,由很多服務器聯合起來實現其功能,集群中的服務器有各自的角色;
重要特性
(1)HDFS中的文件在物理上是分塊存儲(block),塊的大小可以通過配置參數( dfs.blocksize)來規定,默認大小在hadoop2.x版本中是128M,老版本中是64M
(2)HDFS文件系統會給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
(3)目錄結構及文件分塊信息(元數據)的管理由namenode節點承擔
——namenode是HDFS集群主節點,負責維護整個hdfs文件系統的目錄樹,以及每一個路徑(文件)所對應的block塊信息(block的id,及所在的datanode服務器)
(4)文件的各個block的存儲管理由datanode節點承擔
---- datanode是HDFS集群從節點,每一個block都可以在多個datanode上存儲多個副本(副本數量也可以通過參數設置dfs.replication)
(5)HDFS是設計成適應一次寫入,多次讀出的場景,且不支持文件的修改
(注:適合用來做數據分析,並不適合用來做網盤應用,因為,不便修改,延遲大,網絡開銷大,成本太高)
圖解HDFS
通過上面的描述我們知道,hdfs很多特點:
保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復(默認存3份)。
運行在廉價的機器上
適合大數據的處理。HDFS默認會將文件分割成block,,在hadoop2.x以上版本默認128M為1個block。然后將block按鍵值對存儲在HDFS上,並將鍵值對的映射存到內存中。如果小文件太多,那內存的負擔會很重。
如上圖所示,HDFS也是按照Master和Slave的結構。分NameNode、SecondaryNameNode、DataNode這幾個角色。
NameNode:是Master節點,是大領導。管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;
SecondaryNameNode:是一個小弟,分擔大哥namenode的工作量;是NameNode的冷備份;合並fsimage和fsedits然后再發給namenode。
DataNode:Slave節點,奴隸,干活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操作。
熱備份:b是a的熱備份,如果a壞掉。那么b馬上運行代替a的工作。
冷備份:b是a的冷備份,如果a壞掉。那么b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之后的損失。
fsimage:元數據鏡像文件(文件系統的目錄樹。)
edits:元數據的操作日志(針對文件系統做的修改操作記錄)
namenode內存中存儲的是=fsimage+edits。
SecondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合並,然后再發送給namenode。減少namenode的工作量。
HDFS的局限性
1)低延時數據訪問。在用戶交互性的應用中,應用需要在ms或者幾個s的時間內得到響應。由於HDFS為高吞吐率做了設計,也因此犧牲了快速響應。對於低延時的應用,可以考慮使用HBase或者Cassandra。
2)大量的小文件。標准的HDFS數據塊的大小是64M,存儲小文件並不會浪費實際的存儲空間,但是無疑會增加了在NameNode上的元數據,大量的小文件會影響整個集群的性能。
前面我們知道,Btrfs為小文件做了優化-inline file,對於小文件有很好的空間優化和訪問時間優化。
3)多用戶寫入,修改文件。HDFS的文件只能有一個寫入者,而且寫操作只能在文件結尾以追加的方式進行。它不支持多個寫入者,也不支持在文件寫入后,對文件的任意位置的修改。
但是在大數據領域,分析的是已經存在的數據,這些數據一旦產生就不會修改,因此,HDFS的這些特性和設計局限也就很容易理解了。HDFS為大數據領域的數據分析,提供了非常重要而且十分基礎的文件存儲功能。
HDFS保證可靠性的措施
1)冗余備份
每個文件存儲成一系列數據塊(Block)。為了容錯,文件的所有數據塊都會有副本(副本數量即復制因子,課配置)(dfs.replication)
2)副本存放
采用機架感知(Rak-aware)的策略來改進數據的可靠性、高可用和網絡帶寬的利用率
3)心跳檢測
NameNode周期性地從集群中的每一個DataNode接受心跳包和塊報告,收到心跳包說明該DataNode工作正常
4)安全模式
系統啟動時,NameNode會進入一個安全模式。此時不會出現數據塊的寫操作。
5)數據完整性檢測
HDFS客戶端軟件實現了對HDFS文件內容的校驗和(Checksum)檢查(dfs.bytes-per-checksum)。
單點故障(單點失效)問題
單點故障問題
如果NameNode失效,那么客戶端或MapReduce作業均無法讀寫查看文件
解決方案
1)啟動一個擁有文件系統元數據的新NameNode(這個一般不采用,因為復制元數據非常耗時間)
2)配置一對活動-備用(Active-Sandby)NameNode,活動NameNode失效時,備用NameNode立即接管,用戶不會有明顯中斷感覺。
共享編輯日志文件(借助NFS、zookeeper等)
DataNode同時向兩個NameNode匯報數據塊信息
客戶端采用特定機制處理 NameNode失效問題,該機制對用戶透明