HDFS原理 | 一文讀懂HDFS架構與設計

1 前言

HDFS(Hadoop Distributed File System)是我們熟知的Hadoop分佈式文件系統,是一個高容錯的系統,能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS以流式數據訪問模式存儲超大文件,將數據按塊分佈式存儲到不同機器上,並被設計成適合運行在普通廉價硬件之上。本文根據Hadoop官網HDFS Architecture這一章節提煉而成,加上筆者自己的理解,希望能夠幫助讀者快速掌握HDFS

2 HDFS特點

  • 流式數據訪問:這點初學者可能不好理解,流式數據訪問模式是HDFS數據訪問特點之一,是指收集到部分數據就開始處理,而不是收集到全部數據再處理,否則會導致比較大的延遲,也會消耗大量內存。

  • 大規模數據集:HDFS對大文件存儲比較友好,HDFS上的一個典型文件大小一般都在GB至TB級。

  • 一次寫入多次讀取:HDFS數據訪問特點之一,文件經過創建、寫入和關閉之後就不能夠改變。這也簡化了數據一致性問題,並且使高吞吐量的數據訪問成爲可能。

  • 不支持低延時數據訪問:這也是HDFS數據訪問的特點,HDFS關係的是高吞吐量,不適合那些低延時數據訪問的應用。

  • 單用戶寫入,不支持任意修改:HDFS的數據以讀爲主,只支持單個寫入者,並且寫操作總是以添加的形式在文末追加,不支持在任意位置進行修改。

3 HDFS架構

HDFS採用Master/Slave架構。一個HDFS集羣有兩個重要的角色,分別是Namenode和Datanode。Namenode是管理節點,負責管理文件系統的命名空間(namespace)以及客戶端對文件的訪問。Datanode是實際存儲數據的節點。HDFS暴露了文件系統的命名空間,用戶能夠以操作文件的形式在上面操作數據。HDFS架構圖如下:

HDFS上的文件是以數據塊的形式存放的,這些數據塊通常存儲在一組Datanode上。Namenode執行文件系統的命名空間操作,比如打開、關閉、重命名文件或目錄。它也負責確定數據塊到具體Datanode節點的映射。Datanode負責處理文件系統客戶端的讀寫請求,並在Namenode的統一調度下執行數據塊的創建、刪除和複製。

4 數據塊與副本機制

HDFS被設計成能夠在一個大集羣中跨機器可靠地存儲超大文件。它將每個文件存儲成一系列的數據塊,除了最後一個,所有的數據塊都是同樣大小的。爲了容錯,文件的所有數據塊都會有副本。每個文件的數據塊大小和副本系數都是可配置的。應用程序可以指定某個文件的副本數目。副本系數可以在文件創建的時候指定,也可以在之後改變。HDFS中的文件都是一次性寫入的,並且嚴格要求在任何時候只能有一個寫入者。

Namenode全權管理數據塊的複製,它週期性地從集羣中的每個Datanode接收心跳信號和塊狀態報告(Blockreport)。接收到心跳信號意味着該Datanode節點工作正常。塊狀態報告包含了一個該Datanode上所有數據塊的列表。

5 機架感知與副本存放

副本的存放是HDFS可靠性和性能的關鍵,HDFS在這方面做了優化,它採用一種稱爲機架感知(Rack Awareness)的策略來改進數據的可靠性、可用性和網絡帶寬的利用率。

大型HDFS實例一般運行在跨越多個機架的計算機組成的集羣上,不同機架上的兩臺機器之間的通訊需要經過交換機。在大多數情況下,同一個機架內的兩臺機器間的帶寬會比不同機架的兩臺機器間的帶寬大。

通過一個機架感知的過程,Namenode可以確定每個Datanode所屬的機架id。一個簡單但沒有優化的策略就是將副本存放在不同的機架上。這樣可以有效防止當整個機架失效時數據的丟失,並且允許讀數據的時候充分利用多個機架的帶寬。這種策略設置可以將副本均勻分佈在集羣中,有利於當組件失效情況下的負載均衡。但是,因爲這種策略的一個寫操作需要傳輸數據塊到多個機架,這增加了寫的代價。

在大多數情況下,副本系數是3,HDFS存放策略是將一個副本存放在本地機架的節點上,一個副本放在同一機架的另一個節點上,最後一個副本放在不同機架的節點上。這種策略減少了機架間的數據傳輸,這就提高了寫操作的效率。機架的錯誤遠遠比節點的錯誤少,所以這個策略不會影響到數據的可靠性和可用性。於此同時,因爲數據塊只放在兩個(不是三個)不同的機架上,所以此策略減少了讀取數據時需要的網絡傳輸總帶寬。這一策略在不損害數據可靠性和讀取性能的情況下改進了寫的性能。

6 HDFS元數據管理

Namenode上保存着HDFS的命名空間。對於任何對文件系統元數據產生修改的操作,Namenode都會使用一種稱爲EditLog的事務日誌記錄下來。例如,在HDFS中創建一個文件,Namenode就會在Editlog中插入一條記錄來表示;同樣地,修改文件的副本系數也將往Editlog插入一條記錄。Namenode在本地操作系統的文件系統中存儲這個Editlog。整個文件系統的命名空間,包括數據塊到文件的映射、文件的屬性等,都存儲在一個稱爲FsImage的文件中,這個文件也是放在Namenode所在的本地文件系統上。

Namenode在內存中保存着整個文件系統的命名空間和文件數據塊映射(Blockmap)的映像。當Namenode啓動,或者檢查點被週期性觸發時,它從硬盤中讀取Editlog和FsImage,將所有Editlog中的事務作用在內存中的FsImage上,並將這個新版本的FsImage從內存持久化到本地磁盤上。然後HDFS刪除舊的Editlog,因爲這個舊的Editlog的事務都已經作用在FsImage上了。這個過程被稱爲一個檢查點(checkpoint)。在檢查點期間,Editlog的更改將應用於FsImage。checkpoint觸發時機,可以是以給定的時間間隔(dfs.namenode.checkpoint.period,單位秒)觸發,或者在給定數量的文件系統事務累積之後(dfs.namenode.checkpoint.txns)觸發。如果設置了這兩個屬性,則要達到的第一個閾值將觸發檢查點。

7 總結

本文屬於HDFS入門介紹,主要介紹了HDFS基本架構、副本機制,機架感知及元數據管理等方面內容。更多HDFS原理可以參考官網https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

往期推薦  點擊標題可跳轉

HBase實踐 | HBase內核優化與吞吐能力建設

實時數倉 | 你想要的數倉分層設計與技術選型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章