您好,登錄后才能下訂單哦!
小編給大家分享一下HDFS中需要掌握什么知識點,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Hadoop作為大數據時代代表性的解決方案被大家所熟知,它主要包含兩部分內容:
HDFS分布式文件存儲
MapReduce分a布式計算框架
前面我們分析存儲方案的發展的時候有提到分布式文件存儲的出現是為了解決存儲的三大問題:可擴展性,高吞吐量,高可靠性
那么Hadoop的核心HDFS是如何解決上面三個問題的呢?
其實設計一個系統我們要考慮到它的應用場景,然后對它的功能和特性進行設計,做出取舍。我們可能會關注這幾個問題:
原始存儲格式 or 特殊存儲格式,通過什么格式存儲才能方便的管理數據,保證數據的遷移和安全。
大文件 or 小文件,文件系統適合大文件還是小文件存儲,如何提供I/O效率。
數據高可用 or 空間利用率,通過復制副本技術提高數據可用性必然會降低空間利用率,應該如何取舍。
是否有元數據服務,元數據服務是保存存儲數據元數據信息的服務,讀寫數據都需要連接元數據服務器保證一致性。存在元數據服務勢必會存在單點問題和性能瓶頸問題。
上面這個4個問題劃重點,要考的!!!
HDFS它的設計目標就是把超大的數據集存儲到多臺普通計算機上,并且可以提供高可靠性和高吞吐量的服務,支持通過添加節點的方式對集群進行擴容。所以HDFS有著它自己的設計前提:
對存儲大文件支持很好,不適用于存儲大量小文件
通過流式訪問數據,保證高吞吐量而不是低延時的用戶響應
簡單一致性,使用場景應為一次寫入多次讀取,不支持多用戶寫入,不支持任意修改文件。
冗余備份機制,空間換可靠性(Hadoop3中引入糾刪碼機制,糾刪碼需通過計算恢復數據,實為通過時間換空間,有興趣的可以查看RAID的實現)
移動計算優于移動數據,為支持大數據處理主張移動計算優于移動數據,提供相關接口。
遵循以上的設計前提和目標最終的成品就是我們日常應用中的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節點,保證集群里面的數據庫始終維持指定的副本數量。
寫流程
首先,HDFS Client和NameNode建立連接,告訴NameNode要存儲一個文件。NameNode維護著DataNode的列表,知道哪些DataNode上面還有空間可以進行存儲。
NameNode通過查看存儲的元數據信息,發現DataNode1,2,3上可以進行存儲。于是他將此信息返回給HDFS Client。
HDFS Client接受到NameNode的返回的DataNode列表后,Client會與距離最近DataNode1建立連接,讓其準備好接收數據。然后將文件進行分塊,將數據塊1和NameNode返回的DataNode列表信息一起發送給DataNode1.
DataNode1通過列表信息得知要發送給DataNode2.所以DataNode1將數據與列表信息發送給DataNode2.DataNode2又發送給DataNode3,此時數據塊1已經存儲完成并備份了三份。
當DataNode1,2,3都接收并存儲數據塊1后,會向NameNode發送信息,告知已經接收到了數據塊1.并把數據塊1相關信息發送給NameNode,NameNode更新元數據信息并 與Client通信告知數據塊1已經存儲完畢。然后Client開始進行數據塊2的存儲。
這里需要注意的是一個大型的HDFS文件系統一般都是需要跨很多機架的,不同機架之間的數據傳輸需要經過網關,并且,同一個機架中機器之間的帶寬要大于不同機架機器之間的帶寬。如果把所有的副本都放在不同的機架中,這樣既可以防止機架失敗導致數據塊不可用,又可以在讀數據時利用到多個機架的帶寬,并且也可以很容易的實現負載均衡。如果副本數量是3的情況下,HDFS默認把***個副本放到機架的一個節點上,另一個副本放到同一個機架的另一個節點上,把***一個節點放到不同的機架上。這種策略減少了跨機架副本的個數提高了寫的性能,也能夠允許一個機架失敗的情況,算是一個很好的權衡。
讀流程
HDFS Client與NameNode建立鏈接,告訴NameNode要讀取文件xxx。
NameNode通過查詢自己的元數據信息,得到文件xxx的數據塊映射信息及存儲數據塊的DataNode列表。然后將這些信息發送給Client。
Client得到這些信息之后,尋找最近可用的DataNode1.取回數據塊1.從DataNode2取回數據塊2. 自此成功讀取文件xxx
如果DataNode2出現問題掛掉了,則從DataNode3進行數據塊讀取。
文件讀取時,NameNode會選擇最近的DataNode提供給客戶端。
以上是“HDFS中需要掌握什么知識點”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。