分佈式文件系統HDFS簡要介紹

HDFS 的設計主要基於如下六點考慮:node

(1)容錯緩存

獨立計算機的硬件錯誤不能當異常狀況處理,而屬於正常狀態。HDFS 文件系統中會有許多個普通計算機節點構成, 在任什麼時候間任何一個節點都有可能出現故障, 所以HDFS 應該設計成可以自動恢復和快速檢測錯誤, 這應該是維持HDFS 可靠運行的核心目標。服務器

(2)流式訪問數據集網絡

HDFS上運行的應用程序須要以流式訪問所存儲的數據集。這些應用程序都採用並行的批處理方式進行數據計算,不一樣於普通系統上用於數據處理的應用程序。提升數據訪問吞吐量是研究HDFS的重點,響應時間和數據訪問的延遲則不做過多考慮。架構

(3)大數據存儲分佈式

HDFS 最基本的目標就是支持大數據存儲。一個存儲在HDFS 系統上面的普通文件大小都在千兆至T 字節, 一個HDFS 應用最基本的要求是能支撐海量文件。佈局

(4) 數據一致性性能

HDFS 應用處理文件的方式是一次寫入屢次讀取。單個文件寫入到HDFS 中後就不須要改變。這種處理文件的方式讓數據一致性問題獲得簡化, 可以大幅度的提升HDFS 文件訪問的吞吐量。大數據

(5)速度spa

移動計算的方式代價比移動數據的方式開銷要低。一個須要計算的請求,若是計算離操做數據越近那麼計算出來的結果就越高效, 特別是在海量級別的數據計算時,效率更加明顯。

(6)可移植性

在異構的軟件和硬件平臺間提供可移植性。HDFS 由Java 語言開發,Java 語言的跨平臺特性完美的解決了這一要求。



HDFS採用master/slave架構。一個HDFS集羣是由一個Namenode和必定數目的Datanode組成,這些Datanode定時和Namenode通訊,像Namenode反饋狀態以及接受Namenode的指令[p。爲了減輕Namenode的負擔,Namenode上並不須要永久保存全部Datanode上包含有哪些數據塊的信息,而是經過Datanode在啓動時的上報數據塊信息,來更新Namenode上的映射表。HDFS暴露了文件系統的名字空間,用戶能夠經過以文件的形式在上面存儲數據。從內部看,一個文件其實被分紅一個或多個數據塊(至少須要被劃分紅一個塊),這些塊一般存儲在多個Datanode上,經過冗餘性來保證可靠性以及加快後期的讀取速度。Datanode負責處理分佈式文件系統客戶端的實際的讀寫數據請求。在Namenode的統一調度下進行數據塊的建立、刪除和複製。

HDF S是一個能在大集羣中存儲超大文件的系統,支持跨機器存儲,並且運行可靠。每一個文件都會被分紅一系列大小爲64MB(初始定義爲64,實際在工程中能夠本身設置,報告的後面會有相關操做)的數據塊,最後一個數據塊除外。爲了容錯,在文件的數據塊存儲到DataNode中時相應的都會存儲副本。通常狀況下都會有三個副本而且放在不一樣的地方,第一個副本會被放在本地節點,同時本地機架上的另一個節點會放置第二個副本,第三個副本則經複製後分別放到不一樣機架上的節點。這種方式的好處就是能夠減小機架內的寫流量,提升了寫的性能,同時,能夠自由配置每一個文件的數據塊大小和副本系數,應用程序能夠指定某個文件的副本數目。副本系數能夠在文件建立以前制定或者建立以後修改。


Namenode是整個分佈式文件系統的主服務器,是整個系統的核心,從命名咱們能夠清晰的看出是整個系統的名稱服務器,Namenode做爲HDFS中文件目錄和文件分配的管理者,它保存的最重要信息,就是下面兩個映射:文件名到數據塊;數據塊到Datanode列表。其中文件名到數據塊的信息保存在磁盤上(持久化);但Namenode上不保存數據塊到Datanode列表。在保存文件名到數據塊的過程當中,爲了保證每次修改不須要重新保存整個結構,HDFS使用操做日誌來保存更新。如今能夠獲得Namenode須要存儲在Disk上的信息了,包括:in_use.lock,fsimage和edits.in_use.lock的功能和Datanode的一致。fsimage保存的是文件系統的目錄樹,edits則是文件樹上的操做日誌,fstime是上一次新打開一個操做日誌的時間(long型)。除此以外,Namenode執行文件系統的名字空間操做,好比打開、關閉、重命名文件或目錄。它也負責肯定數據塊到具體Datanode節點的映射。NAMENODE主要功能

(1)管理元數據和文件塊

管理元數據就是對它包含的名字空問、文件到文件塊的映射、文件塊到數據節點的映射進行管理。其中,要求文件名到數據塊的映射不只要保留在內存中,還要持久化到磁盤上。文件塊的管理不只包括文件塊的新建、複製,同時還包括無效文件塊的移除以及孤立文件塊的回收等。

(2)簡化元數據更新操做

爲了不每次都要從新保存整個結構,NameNode會記錄每次對文件系統的元數據進行修改的操做,並用事務日誌(Editlog)進行表示。與此相似,修改文件的副本系數的操做也會被記錄到Editlog中,而Editlog會被NameNode存儲到本地的操做系統的文件系統中。NameNode管理整個存儲在FsImage文件中的文件系統的命名空間,包括文件的屬性、數據塊到文件的映射,FsImage文件與Editlog同樣都被存儲在NameNode所在的本地文件系統中。當NameNode啓動時,Editlog和FsImage就從硬盤中被其讀取,把Editlog記錄的全部事務做用於FsImage,並將新產生的Fslmage替代舊的Editlog刷新到硬盤中。

(3)監聽和處理請求

與客戶端和DataNode不一樣,NameNode只是監聽客戶端事件及DataNode事件。而不會主動發起請求,客戶端事件一般包括目錄和文件的建立、讀寫、重命名和刪除,以及文件列表信息獲取等。DataNode事件主要包括數據塊信息的彙報、心跳響應、出錯信息等。當NameNode監聽到這些請求時便對他們響應,並將相應的處理結果返回到請求端。

(4)心跳檢測

鏈接創建之後,DataNode和NameNode之間會不斷保持心跳,這樣DataNode在向NameNode彙報本身的負載狀況的同時還會接收來自NameNode的指令信息。若是有哪一個DataNode沒有在必定時間內對NameNode按期的ping做出迴應,就會被認爲是出現了故障,此時,NameNode就會從新調整整個文件系統。


Datanode負責存儲數據,一個數據塊在多個Datanode中有備份,而一個Datanode對於一個數據塊最多隻包含一個備份。因此能夠簡單地認爲Datanode上存了數據塊ID和數據塊內容,以及他們的映射關係。一個HDFS集羣可能包含上千Datanode節點,這些Datanode定時和Namenode通訊,接受Namenode的指令。爲了減輕Namenode的負擔,Namenode上並不永久保存那個 Datanode上有那些數據塊的信息,而是經過Datanode啓動時的上報,來更新Namenode上的映射表。

Datanode和Namenode創建鏈接之後,就會不斷地和Namenode保持心跳。心跳返回時包含了Namenode對Datanode的一些命令,如刪除某個數據塊或者是把數據塊從一個D atanode複製到另外一個D atanode。應該注意的是:Namenode不會發起到Datanode的請求,在這個通訊過程當中,它們是嚴格的客戶端/服務器架構。Datanode固然也做爲服務器接受來自客戶端的訪問,處理數據塊讀/寫請求。Datanode之間還會相互通訊,執行數據塊複製任務,同時,在客戶端作寫操做的時候,Datanode須要相互配合,保證寫操做的一致性。

DATANODE主要功能:

(1) 數據塊的讀寫。

全部文件的數據塊都存儲在DataNode中,但客戶端並不知道某個數據塊具體的位置信息,因此不能直接經過DataNode進行數據塊的相關操做,全部這些位置信息都存儲在NameNode。所以,當系統客戶端須要執行數據塊的建立、複製和刪除等操做時,須要首先訪問NameNode以獲取數據塊的位置信息,而後再訪問指定的DataNode來執行相關操做,具體的文件操做最終由客戶端進程而非DataNode來完成。

(2) 向NameNode報告狀態。

因爲數據塊到DataNode的映射並無持久化到NameNode本地磁盤,NameNode只能經過與DataNode之間的心跳信號來掌握文件塊狀態,進而掌握整個工做集羣中全部DataNode節點狀態的總體佈局,假如DataNode出現異常狀態,及時做出調整。當某個DataNode出現故障而致使失效時,爲了保證數據塊的副本數量達到規定範圍。NameNode就會調度相關DataNode執行失效結點上數據塊的複製操做。

(3) 執行數據的流水線複製。

當建立文件或者是某些DataNode出現故障而致使數據塊副本數量少於規定數目時,系統要執行數據塊複製操做。客戶端在從NameNode獲取到須要進行復制的數據塊列表以後,首先會把緩存於客戶端的數據塊複製到第一個DataNode上,而後採起流水線複製的方式,在同一時間將第一個DataNode上的數據複製到第二個DataNode,以此類推,直到全部數據塊的複製操做所有完成。流水線複製有效地提高了系統的運行速度,特別是針對某些熱點數據須要複製大量Block的情形,每每能取得很是好的效果。

HDFS元數據緩存策略:

HDFS的全部元數據都是由Namenode來進行管理和維護的。在Namenode中一共保存瞭如下3種類型的元數據:文件和塊的命名空間、文件名到塊的映射、以及每一個塊副本的位置。其中文件名到數據塊的映射持久化在磁盤土,而不只僅保留在內存中。全部對目錄樹的更新以及文件名和數據塊之間關係的修改,都必須可以持久化。爲了保證每次修改不須要從新保存整個結構,HDFS使用操做日誌來保存更新。對於任何對文件元數據產生的修改,Namenode都會使用一個稱爲Editlog的事務日誌記錄下來。例如,在HDFS中刪除一個文件,Namenode就會在Editlog中插入一條記錄來表示;一樣,修改文件的複製(replication因子也將在Editlog插入一條記錄。Namenode在本地操做系統的文件系統中存儲這個Editlog。整個文件系統的namespace,包括數據塊到文件的映射、文件的屬性,都存儲在稱爲FsImage的文件中,這個文件也是放在Namenode所在操做系統的文件系統上。

Namenode在內存中保存着整個文件系統的名字空間和文件名到數據塊的映射。這個關鍵的元數據設計得很緊湊,在存儲大文件時,一個帶有4G內存的Namenode足夠支撐海量的文件和目錄。當Namenode啓動時,它從硬盤中讀取Editlog和FsImage,將全部Editlog中的事務做用在內存中的FsImage,並將這個新的FsImage從內存中刷新到硬盤上,而後再丟棄這個舊的Editlog。

數據完整性策略: 

因爲網絡的複雜性,可能致使DataNode 節點讀取的數據爲損壞狀態,緣由有多種可能性,常見的有網絡通訊錯誤、程序問題、DataNode 節點自身存儲等等狀況。這時就須要一套數據校驗機制保證數據的完整性。客戶端寫入一個新的文件時,將會計算每一個文件塊的校驗和, 而後將校驗和保存爲一個單獨的隱藏文件, 並將校驗和文件同時存儲在目錄空間下。若是客戶端要讀取文件,將會同時讀取目錄空間下的校驗文件,並對DataNode 節點上的文件塊的校驗進行匹配, 若是匹配出現錯誤,那麼說明該文件塊的數據有問題,客戶端將會選擇其餘的文件塊副本所在的DataNode 節點進行文件塊讀取操做。

副本放置策略:

在HDFS中,每個數據塊默認條件下都會保存3個備份(也能夠自行修改備份的數量),爲了使後期讀取效率更高而且同時保證數據的可靠性,HDFS設計了相應的副本放置策略,通常狀況下,第一個block副本放在和client所在的node甩(若是client不在集羣範圍內,則這第一個node是隨機選取的,固然系統會嘗試不選擇哪些太滿或者太忙的node)。第二個副本放置在與第一個節點相同的機架中的node中(隨機選擇)。第三個副本與第一二個副本不一樣的機架中,隨機放在不一樣的node中。若是還有更多的副本就隨機放在集羣的任意位置。HDFS的副本放置策略在充分考慮了系統的可靠性(block在不一樣的機架)和帶寬(一個管道只須要穿越一個網絡節點),並在它們之間作了一個很好的平衡。

相關文章
相關標籤/搜索