天天看點

《Hadoop與大資料挖掘》一2.1.2 Hadoop存儲—HDFS

本節書摘來華章計算機《hadoop與大資料挖掘》一書中的第2章 ,第2.1.2節,張良均 樊 哲 位文超 劉名軍 許國傑 周 龍 焦正升 著 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

hadoop的存儲系統是hdfs(hadoop distributed file system)分布式檔案系統,對外部用戶端而言,hdfs就像一個傳統的分級檔案系統,可以進行建立、删除、移動或重命名檔案或檔案夾等操作,與linux檔案系統類似。

但是,hadoop hdfs的架構是基于一組特定的節點建構的(見圖2-2),這些節點包括名稱節點(namenode,僅一個),它在 hdfs 内部提供中繼資料服務;第二名稱節點(secondary namenode),名稱節點的幫助節點,主要是為了整合中繼資料操作(注意不是名稱節點的備份);資料節點(datanode),它為hdfs提供存儲塊。由于僅有一個namenode,是以這是hdfs的一個缺點(單點失敗,在hadoop2.x後有較大改善)。

《Hadoop與大資料挖掘》一2.1.2 Hadoop存儲—HDFS

存儲在hdfs中的檔案被分成塊,然後這些塊被複制到多個資料節點中(datanode),這與傳統的raid架構大不相同。塊的大小(通常為128mb)和複制的塊數量在建立檔案時由客戶機決定。名稱節點可以控制所有檔案操作。hdfs内部的所有通信都基于标準的tcp/ip協定。

關于各個元件的具體描述如下所示:

(1)名稱節點(namenode)

它是一個通常在hdfs架構中單獨機器上運作的元件,負責管理檔案系統名稱空間和控制外部客戶機的通路。namenode決定是否将檔案映射到datanode上的複制塊上。對于最常見的3個複制塊,第一個複制塊存儲在同一機架的不同節點上,最後一個複制塊存儲在不同機架的某個節點上。

(2)資料節點(datanode)

資料節點也是一個通常在hdfs架構中的單獨機器上運作的元件。hadoop叢集包含一個namenode和大量datanode。資料節點通常以機架的形式組織,機架通過一個交換機将所有系統連接配接起來。

資料節點響應來自hdfs客戶機的讀寫請求。它們還響應來自namenode的建立、删除和複制塊的指令。名稱節點依賴來自每個資料節點的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,名稱節點可以根據這個報告驗證塊映射和其他檔案系統中繼資料。如果資料節點不能發送心跳消息,名稱節點将采取修複措施,重新複制在該節點上丢失的塊。

(3)第二名稱節點(secondary namenode)

第二名稱節點的作用在于為hdfs中的名稱節點提供一個checkpoint,它隻是名稱節點的一個助手節點,這也是它在社群内被認為是checkpoint node的原因。

如圖2-3所示,隻有在namenode重新開機時,edits才會合并到fsimage檔案中,進而得到一個檔案系統的最新快照。但是在生産環境叢集中的namenode是很少重新開機的,這意味着當namenode運作很長時間後,edits檔案會變得很大。而當namenode當機時,edits就會丢失很多改動,如何解決這個問題呢?

fsimage是namenode啟動時對整個檔案系統的快照;edits是在namenode啟動後對檔案系統的改動序列。

如圖2-4所示,secondary namenode會定時到namenode去擷取名稱節點的edits,并及時更新到自己fsimage上。這樣,如果namenode當機,我們也可以使用secondary-namenode的資訊來恢複namenode。并且,如果secondarynamenode新的fsimage檔案達到一定門檻值,它就會将其拷貝回名稱節點上,這樣namenode在下次重新開機時會使用這個新的fsimage檔案,進而減少重新開機的時間。

《Hadoop與大資料挖掘》一2.1.2 Hadoop存儲—HDFS

舉個資料上傳的例子來深入了解下hdfs内部是怎麼做的,如圖2-5所示。

《Hadoop與大資料挖掘》一2.1.2 Hadoop存儲—HDFS

檔案在用戶端時會被分塊,這裡可以看到檔案被分為5個塊,分别是:a、b、c、d、e。同時為了負載均衡,是以每個節點有3個塊。下面來看看具體步驟:

1)用戶端将要上傳的檔案按128mb的大小分塊。

2)用戶端向名稱節點發送寫資料請求。

3)名稱節點記錄各個datanode資訊,并傳回可用的datanode清單。

4)用戶端直接向datanode發送分割後的檔案塊,發送過程以流式寫入。

5)寫入完成後,datanode向namenode發送消息,更新中繼資料。

這裡需要注意:

1)寫1t檔案,需要3t的存儲,3t的網絡流量。

2)在執行讀或寫的過程中,namenode和datanode通過heartbeat進行儲存通信,确定datanode活着。如果發現datanode死掉了,就将死掉的datanode上的資料,放到其他節點去,讀取時,讀其他節點。

3)宕掉一個節點沒關系,還有其他節點可以備份;甚至,宕掉某一個機架也沒關系;其他機架上也有備份。