1.Hadoop HDFS架構向導的目的
在這篇關于HDFS文章結構的指南里,你可以讀到所有關于HDFS的東西。首先,我們討論一下HDFS的設計理念和目標。這個結構教程會覆蓋所有Hadoop HDFS的結構細節,比如NameNode, DataNote, 二手節點,檢查節點,和備份節點。HDFS的特征比如機架感知,高可用性,數據塊,復制管理,HDFS數據讀寫操作也會在這個教程中被討論到。
2.什么是Hadoop HDFS?
Hadoop 分布式文件系統是世界上最可靠的文件系統。HDFS可以再大量硬件組成的集群中存儲大文件。它的設計原則是趨向于存儲少量的大文件,而不是存儲大量的小文件。即使在硬件發生故障的時候,HDFS也能體現出它對數據存儲的可靠性。它支持高吞吐量的平行訪問方式。
2.1 HDFS 的理念和目標
I. 硬件故障
硬件故障已經不再是異常了,它變成了一個常規現象。HDFS實例由成千上萬的服務機器組成,這些機器中的任何一個都存儲著文件系統的部分數據。這里元件的數量是龐大的,而且極可能導致硬件故障。這就意味著總是有一些組件不工作。所以,核心結構的目標是快速的自動的進行錯誤檢測和恢復。
II. 流數據訪問
HDFS 應用需要依賴流去訪問它的數據集。Hadoop HDFS的設計方向主要面向于批處理而不是用戶交互。著力點在于重視數據訪問的高吞吐率而不是數據訪問的低延遲性。它注重于如何在分析日志的同時盡肯能快速的獲得數據。
III. 巨大數據集
HDFS通常需要工作在大數據集上。標準的實踐中是,HDFS系統中存在的文件大小范圍是GB(千兆字節)到TB(兆兆字節)。HDFS架構的設計就是如果最好的存儲和獲得大量的數據。HDFS也提供高聚合數據的帶寬。它同樣應該具備在單一集群中可以擴展上百個節點的能力。與此同時,它也應該具備在一個單元實例中處理處理數千萬個文件的能力。
IV. 簡單的一致性模型
它工作在一次性寫入多次的讀取的理論上。一旦數據被創建、寫入和關閉,改文件是不能被修改的。這種方式解決數據一致性的問題同時也實現了高吞吐量訪問數據的需求。基于MapReduce的應用和或者網絡爬蟲的應用在這種模型中擁有很高的適應性。和每一apache筆記一樣,未來計劃增加追加寫入文件這一功能。
V. 轉移計算量比轉移數據更合理
如果一個應用在它操作的數據附近進行計算,總會比在離它遠的地方做計算更高效。這個現象在處理大的數據集時,往往提現的更明顯。這樣做主要的優勢體現在增加系統的總吞吐量上。它同時也最小化了網路阻塞。其理念是,將計算移動到離數據更近的位置,來代替將數據轉移到離計算更近的位置。
VI. 便捷的訪問有不同軟件和硬件組成的平臺
HDFS 被設計成便捷的在平臺之間切換。這讓HDFS系統能夠因為其適應性而廣泛傳播。這是在處理大數據集數據的最好的平臺。
- 什么是HDFS的架構?
Hadoop架構由主/從體系結構構成,主實體是NameNode用來儲存元數據,從實體是DataNode用來實際存放數據。一個HDFS結構包含一個NameNode,剩下的都是DataNodes.
我們下面討論一下Hadoop HDFS架構中節點們的細節。
3.1 什么是HDFS中的NameNode?
NameNode在HDFS架構中也被成為主節點。HDFS NameNode存儲元數據,比如,數據塊的數量,副本的數量和其它的一些細節。這些元數據被存放在主節點的內存中,為了達到最快速度的獲取數據。NameNode 負責維護和管理從節點并且給從節點分配任務。它是整個HDFS的中心環節,所以應該將其部署在可靠性高的機器上。
NameNode的任務清單:
· 管理文件系統命名空間
· 規定客戶端訪問文件規則
· 對文件執行命名,關閉,打開文件或打開路徑等 操作
· 所有的數據節點發送心跳給NameNode, 它需要確保數據是否在線。一個數據塊報告包含所有這個數據點上的所有block的情況。
· NameNode也負責管理復制因子的數量。
文件呈現在NameNode元數據中如下所以:
FsImage(鏡像文件) -
FsImage在NameNode中是一個“鏡像文件”。它將全部的文件系統的命名空間保存為一個文件存儲在NameNode的本地文件系統中,這個文件中還包含所有的文件序列化路徑和在文件系統中的文件inodes,每個inode都是文件或者目錄元數據的內部表示。
EditLogs(日志文件) -
日志文件包含所有在鏡像文件上對系統的最新修改。當NameNode從客戶端收到一個創建/更新/刪除請求時,這條請求會先被記錄到日志文件中。
3.2 什么是HDFS DataNode?
DataNode在HDFS架構中的從節點。在Hadoop HDFS架構,DataNode是實際的存儲數據節點。它可以執行來自客戶端的每個讀和寫的請求。DataNodes可以部署在商品硬件上。
DataNode的任務:
· 根據NameNode的指令對Block進行復制,創建和刪除
· DataNode管理系統數據的存儲
· DataNode發送心跳給NameNode給HDFS報告其本身的確定性。默認情況下3秒鐘上報一次心跳。
3.3 什么是次要NameNode?
在HDFS中,當NameNode運行時,它首先從鏡像文件FsImage中讀取HDFS的狀態,然后它在日志文件中讀取并執行日志文件中的操作指令。執行完畢后將一個最新的HDFS狀態寫給鏡像文件FsImage。寫入狀態完畢之后,我們又得到了一個空的日志文件,繼續等待日常操作的記錄。 在啟動時,NameNode會將鏡像文件和日志文件融合,因此隨著時間的推移,日志文件可能會變得非常大。擁有較大的日志文件的后果是在下一次重新啟動Namenode時需要更長的時間。
次要NameNode的產生就是為了解決這個問題,次要NameNode從NameNode下載FsImage和EditLogs。然后將EditLogs和FsImage進行融合。它給日志文件的大小一個限制。它將融合后的FsImage文件存儲在一個永久存儲器中。我們可以在NameNode出現故障的時候使用它。
次要NameNode在HDFS中起到一個常規檢查點的作用。
3.4 什么是檢查點節點?
檢查節點是一個定期在命名空間創建檢查點的節點。在Hadoop中的檢查點先從活動的Namenode中下載FsImage文件和日志文件,它在本地將兩個文件進行融合,然后上傳新的鏡像給活動NameNode。它存儲最后的檢查點的結構,所以它的路徑結構應該跟NameNode的路徑結構一樣。讀取檢查點鏡像的權限,如果有必要應該一直為NameNode開放。
3.5 什么是備份節點?
備份節點也提供和檢查節點一樣的檢查功能。在Hadoop中,Backup節點保留內存中最新文件系統命名空間的副本。它和NameNode的狀態總是同步的。在HDFS架構中的備份節點不需要從活動的NameNode中下載FsImage和它日志文件去創建檢查點。它在內存中已經擁有了最新的命名空間狀態。備份節點的檢查點流程比起檢查節點的檢查流程效率更高,因為它只需要保存命名空間到本地鏡像文件和重置日志文件就夠了。NameNode一次只支持一個備份節點。
3.6 HDFS架構中的Blocks是什么?
HDFS將巨大的文件分割成小的文件塊,這種文件塊就叫Blocks. 這些Blocks是文件系統中最小的數據單元。客戶端或者管理員,不需要控制這些blocks的存儲位置,由NameNode決定類似的事情。
默認的HDFS block大小為128MB,當然這值可以根據不同需求而改變。一個文件除了最后一個block其他block的大小都是相同的,最后一個文件的大小可以是128MB,也可以更小。如果數據的大小比block默認值的大小小的話,block大小就會等于數據的大小。例如一個數據的大小為129MB,則系統會為這個數據創建兩個Block一個大小為128MB,另一個大小只為1MB. 存儲成這樣的好處是,既可以節省空間,有可以節省查詢時間。
3.7 什么是復制管理?
Block復制支持容錯機制。如果一個副本不能被訪問或者損壞,我們可以從其他的副本中讀取數據。在HDFS架構中一個文件的副本數量叫做復制因子。默認的復制因子為3,可以通過修改配置文件修改復制因子。當復制因子為3的時候每個block會被存放在3個不同的DataNode中。
如果一個文件是128MB,根據默認配置它將占用384MB的系統空間存儲。
NameNode通過從DataNode定期接收數據塊上報去維護復制因子,當一個數據塊過多復制或者復制不足,則NameNode負責根據需要增加或刪除副本。
3.8 什么是HDFS架構中的機架感知?
在大型的Hadoop集群中,為了提高讀、寫HDFS文件的效率,NameNode都是按就近原則選擇數據節點的,一般的都是選擇相同機架的DataNode或者是鄰近機架的DataNode去讀、寫數據。NameNode通過為維護每個數據節點的機架ID來獲取機架信息。機架感知在hadoop中是一個有機架信息來獲取數據節點的概念。
在HDFS架構中, NameNode必須確保所有的副本不存放在相同機架或者單一機架中。它遵循機架感知算法來減少延遲和提高容錯。我們知道默認的復制因子為3。根據機架感知算法,一個數據塊的第一個副本會存儲在本地機架上,第二個副本會存儲在同一個機架的不同DataNode上,第三個副本會存儲在Hadoop集群中的不同機架上。
機架感知對于提升一下方面有著重要作用:
· 數據高可用性和可靠性
· 集群的表現
· 提升網絡帶寬
3.9 HDFS讀、寫操作
3.9.1 寫操作
當客戶端想寫入一個文件到HDFS中時,它與NameNode進行交互,索取元數據。NameNode根據請求,返回一定數量的blocks和他們的位置,副本和其他的信息給客戶端。根據從NameNode獲取的信息,客戶端將文件分割成多個blocks,然后開始講這些blocks發送給第一個數據節點。
客戶端首先向DataNode 1發送block A和其它個數據節點的信息。當DataNode 1收到從客戶端發來的block A,它復制相同的block給同一機架上DataNode 2。由于這兩個數據節點在同一個機架上,所以數據塊傳遞通過機架開關。現在DataNode 2復制同樣的block給DataNode 3,因為這兩個數據節點在不同的機架上,所以兩者之間的塊傳輸通過一個機架外開關。
當DataNode收到從客戶端傳遞過來的Blocks,它會發送給NameNode一個確認信息。這個過程會持續重復,直到這個文件每一個block被發完。
3.9.2 讀操作
從HDFS中讀取文件,客戶端也需要跟NameNode通訊請求元數據。客戶端給出文件名稱和它自身的地址,NameNode響應請求并返回blocks的數量、位置、副本等其他信息。
現在客戶端直接跟數據節點進行通訊,客戶端開始平行的從NameNode提供的數據節點上讀取數據。當客戶端或者應用收到所以的blocks的時候,它將這些數據塊還原成原始的文件形態。