HDFS儲存原理
1. 引言
在整個 hadoop 框架中,主要存在三個元件:HDFS、MapReduce 和 YARN,HDFS 主要負責資料的儲存,MapReduce 則資料模型的運算,YARN 負責資源的排程。接下來的博文會對這幾個元件進行一一介紹,這篇博文先聊一聊 HDFS 的儲存原理。
2. HDFS實現機制
HDFS 主要是為了應對海量資料的儲存,由於資料量非常大,因此一臺伺服器是解決不能夠應付的,需要一個叢集來儲存這些資料。在這個叢集中,存在一個 NameNode 節點,該節點用於管理元資料,即使用者上傳的檔案位於哪個伺服器上,都多少個副本等資訊。此外,還有多個 DataNode
- 保證資料的安全性,即資料應該有足夠多的副本
- 能夠適應高併發的訪問
- 因為這些資料是儲存在多個伺服器上的,因此需要保證每個伺服器的負載均衡
HDFS 的設計很巧妙,完美的解決了這幾個問題。當用戶上傳一個檔案時,會提供一個 虛擬路徑,該路徑是方便客戶端對檔案進行讀寫操作的,NameNode 中存在該路徑和真實的儲存物理路徑的對映。NameNode 會先判斷上傳的檔案是否存在,如果不存在,則允許使用者繼續上傳。
客戶端收到伺服器允許上傳檔案的響應之後,會將該檔案分為一個個塊(block),每個塊預設大小為 128MB,將每個塊依次傳送到 Datanode 中,由 NameNode 記錄塊的儲存位置等資訊儲存在元資料中。為了保證資料有足夠多的副本,這時伺服器會進行一個非同步的操作,將這個塊再進行復制操作,隨機儲存到一個 DataNode 中(這裡隨機儲存是為了保證伺服器的負載均衡,避免多個客戶端對同一個檔案進行訪問,這個檔案和其副本都儲存在同一個 DataNode 節點上的情況)。儲存的大致過程如下:
3. NameNode 工作原理
上面講述了 HDFS 的實現機制,不過這樣儲存實際上只解決了兩個問題:資料的安全性和每個伺服器的負載均衡,但是當多個客戶端同時上傳檔案時,都需要訪問 NameNode 節點,在這種高併發的情況下,NameNode 是如何應付的呢?
上面說過,NameNode 是通過元資料來定位檔案的儲存路徑的,如果元資料只是儲存在磁碟檔案中,當多個客戶端同時訪問時,響應速度就會受到限制。HDFS 是這樣解決這個問題的:首先,會有一個 fsimage 檔案,用於儲存所有的元資料,fsimage 檔案中的資料會 載入到記憶體中,這樣就提高了讀取檔案的速度。除此之外,還有一個 edits log
通過這樣的設計,由於記憶體讀取資料非常快,因此能夠適應多個客戶端同時訪問的壓力。而且當伺服器碰到意外情況時,例如突然斷電或者伺服器崩潰等情況,雖然記憶體中的元資料會丟失,但由於 edits log 和 fsimage 儲存著元資料,依然可以找到檔案儲存的真實路徑,只是在伺服器恢復之前不能夠再進行上傳和下載操作了。(不過有一個 HA 機制可以避免 NameNode 崩潰之後還可以繼續提供服務,這個稍後再進行了解。)
由於 edits log 是日誌,其儲存的格式與元 fsimage 儲存的元資料格式不一樣,在進行合併操作時,需要進行額外的邏輯運算,如果這些運算直接在 NameNode 中進行的話,無疑會增大 CPU 的負荷,HDFS 便將這些操作放在 Secondary Node 中進行,整個過程如下:
注:這是我對 HDFS 儲存機制的理解,由於剛開始接觸 HDFS,因此文中可能會有錯誤,歡迎指正。