您好,登錄后才能下訂單哦!
小編給大家分享一下分布式文件系統HDFS有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
HDFS 的設計主要基于以下六點考慮:
(1)容錯
獨立計算機的硬件錯誤不能當異常情況處理,而屬于正常狀態。HDFS 文件系統中會有許多個普通計算機節點構成, 在任何時間任何一個節點都有可能出現故障, 因此HDFS 應該設計成能夠自動恢復和快速檢測錯誤, 這應該是維持HDFS 可靠運行的核心目標。
(2)流式訪問數據集
HDFS上運行的應用程序需要以流式訪問所存儲的數據集。這些應用程序都采用并行的批處理方式進行數據計算,不同于普通系統上用于數據處理的應用程序。提高數據訪問吞吐量是研究HDFS的重點,響應時間和數據訪問的延遲則不作過多考慮。
(3)大數據存儲
HDFS 最基本的目標就是支持大數據存儲。一個存儲在HDFS 系統上面的普通文件大小都在千兆至T 字節, 一個HDFS 應用最基本的要求是能支撐海量文件。
(4) 數據一致性
HDFS 應用處理文件的方式是一次寫入多次讀取。單個文件寫入到HDFS 中后就不需要改變。這種處理文件的方式讓數據一致性問題得到簡化, 能夠大幅度的提高HDFS 文件訪問的吞吐量。
(5)速度
移動計算的方式代價比移動數據的方式開銷要低。一個需要計算的請求,如果計算離操作數據越近那么計算出來的結果就越高效, 特別是在海量級別的數據計算時,效率更加明顯。
(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在不同的機架)和帶寬(一個管道只需要穿越一個網絡節點),并在它們之間做了一個很好的平衡。
以上是“分布式文件系統HDFS有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。