1. 程式人生 > >HDFS你一定要知道,要考的

HDFS你一定要知道,要考的

失效 分享 列表 ~~ 均衡 負載均衡。 統一 服務器 疑問

你肯定聽過Hadoop,對就是那頭奔跑的小象。

技術分享圖片

Hadoop作為大數據時代代表性的解決方案被大家所熟知,它主要包含兩部分內容:

HDFS分布式文件存儲

MapReduce分a布式計算框架

前面我們分析存儲方案的發展的時候有提到分布式文件存儲的出現是為了解決存儲的三大問題:可擴展性,高吞吐量,高可靠性

那麽Hadoop的核心HDFS是如何解決上面三個問題的呢?

其實設計一個系統我們要考慮到它的應用場景,然後對它的功能和特性進行設計,做出取舍。我們可能會關註這幾個問題:

  1. 原始存儲格式 or 特殊存儲格式,通過什麽格式存儲才能方便的管理數據,保證數據的遷移和安全。

  2. 大文件 or 小文件,文件系統適合大文件還是小文件存儲,如何提供I/O效率。

  3. 數據高可用 or 空間利用率,通過復制副本技術提高數據可用性必然會降低空間利用率,應該如何取舍。

  4. 是否有元數據服務,元數據服務是保存存儲數據元數據信息的服務,讀寫數據都需要連接元數據服務器保證一致性。存在元數據服務勢必會存在單點問題和性能瓶頸問題。

上面這個4個問題劃重點,要考的!!!

HDFS它的設計目標就是把超大的數據集存儲到多臺普通計算機上,並且可以提供高可靠性和高吞吐量的服務,支持通過添加節點的方式對集群進行擴容。所以HDFS有著它自己的設計前提:

  1. 對存儲大文件支持很好,不適用於存儲大量小文件

  2. 通過流式訪問數據,保證高吞吐量而不是低延時的用戶響應

  3. 簡單一致性,使用場景應為一次寫入多次讀取,不支持多用戶寫入,不支持任意修改文件。

  4. 冗余備份機制,空間換可靠性(Hadoop3中引入糾刪碼機制,糾刪碼需通過計算恢復數據,實為通過時間換空間,有興趣的可以查看RAID的實現)

  5. 移動計算優於移動數據,為支持大數據處理主張移動計算優於移動數據,提供相關接口。

遵循以上的設計前提和目標最終的成品就是我們日常應用中的HDFS了。HDFS主要由NameNode和DataNode構成,以Master/Slave模式運行。我們來詳細了解一下。

技術分享圖片

數據塊

技術分享圖片

這個就對應前面我們提出的疑問“原始存儲格式 or 特殊存儲格式”,在HDFS上抽象出了一個數據塊的概念。可以認為是HDFS的特殊存儲格式,當你存儲文件的時候不是以文件為單位進行數據存儲的,而是以數據塊為單位進行存儲。這樣有什麽好處呢?首先,它屏蔽了文件的概念,如果你存一個超大的文件,文件的大小大於你任何一個單個磁盤的大小,在HDFS中會把你的文件切割成多個數據塊,存儲到不同機器的不同磁盤中。這樣就簡化了存儲系統的設計,而且也適用於數據的備份、遷移功能,提高了數據的容錯性和可用性。

NameNode

這個對應前面的疑問“是否有元數據服務”,在HDFS中NameNode就起著元數據管理服務的作用,它管理著整個文件系統的命名空間,維護著文件系統樹詳情並對其持久化。

當我們寫入或者讀取數據時都需要先連接NameNode,獲取可操作的DataNode節點才能繼續操作。所以NameNode是存在單點問題和性能問題的。Hadoop2中可以配置HA的模式,一個集群擁有兩個NameNode一個處於Active狀態一個處於Standby狀態,其中一個失效後另一個可以自動切換成Active,進而解決了一部分單點問題。(在Hadoop3中支持配置多個NameNode,進一步解決NameNode的單點問題)。NameNode將元數據信息保存在內存中,內存就是NameNode的性能瓶頸,如果集群中小文件過多會產生大量元數據信息占用NameNode的內存。所以HDFS對大文件的支持更好。NameNode會占用較多的內存和I/O資源,所以運行NameNode的節點不會啟動DataNode或者執行MapReduce任務。

DataNode

DataNode就是HDFS的工作節點了,它負責存儲數據,為客戶端提供數據塊的讀寫服務。在啟動時會將它存儲的數據塊的列表發送給NameNode,根據NameNode的要求對數據塊進行創建、刪除和備份,還會通過心跳定期向NameNode更新存儲數據塊信息。

HDFS通過備份副本的方式實現可靠性,Hadoop2缺省的數據塊大小為128M,復制因子為,默認的備份副本的分布位置與機架和節點有關。當DataNode丟失連接後,NameNode會把失敗節點的數據(從其他備份副本節點)復制到另外一個健康的DataNode節點,保證集群裏面的數據庫始終維持指定的副本數量。

寫流程

技術分享圖片

  1. 首先,HDFS Client和NameNode建立連接,告訴NameNode要存儲一個文件。NameNode維護著DataNode的列表,知道哪些DataNode上面還有空間可以進行存儲。
  2. NameNode通過查看存儲的元數據信息,發現DataNode1,2,3上可以進行存儲。於是他將此信息返回給HDFS Client。
  3. HDFS Client接受到NameNode的返回的DataNode列表後,Client會與距離最近DataNode1建立連接,讓其準備好接收數據。然後將文件進行分塊,將數據塊1和NameNode返回的DataNode列表信息一起發送給DataNode1.
  4. DataNode1通過列表信息得知要發送給DataNode2.所以DataNode1將數據與列表信息發送給DataNode2.DataNode2又發送給DataNode3,此時數據塊1已經存儲完成並備份了三份。
  5. 當DataNode1,2,3都接收並存儲數據塊1後,會向NameNode發送信息,告知已經接收到了數據塊1.並把數據塊1相關信息發送給NameNode,NameNode更新元數據信息並 與Client通信告知數據塊1已經存儲完畢。然後Client開始進行數據塊2的存儲。

這裏需要註意的是一個大型的HDFS文件系統一般都是需要跨很多機架的,不同機架之間的數據傳輸需要經過網關,並且,同一個機架中機器之間的帶寬要大於不同機架機器之間的帶寬。如果把所有的副本都放在不同的機架中,這樣既可以防止機架失敗導致數據塊不可用,又可以在讀數據時利用到多個機架的帶寬,並且也可以很容易的實現負載均衡。如果副本數量是3的情況下,HDFS默認把第一個副本放到機架的一個節點上,另一個副本放到同一個機架的另一個節點上,把最後一個節點放到不同的機架上。這種策略減少了跨機架副本的個數提高了寫的性能,也能夠允許一個機架失敗的情況,算是一個很好的權衡。

讀流程

技術分享圖片

  1. HDFS Client與NameNode建立鏈接,告訴NameNode要讀取文件xxx。
  2. NameNode通過查詢自己的元數據信息,得到文件xxx的數據塊映射信息及存儲數據塊的DataNode列表。然後將這些信息發送給Client。
  3. Client得到這些信息之後,尋找最近可用的DataNode1.取回數據塊1.從DataNode2取回數據塊2. 自此成功讀取文件xxx
  4. 如果DataNode2出現問題掛掉了,則從DataNode3進行數據塊讀取。

文件讀取時,NameNode會選擇最近的DataNode提供給客戶端。

劃重點劃重點,要考的!!!

歡迎關註我:叁金大數據(不穩定持續更新~~~)
技術分享圖片

HDFS你一定要知道,要考的