HDFS Architecture

不要亂摸發表於2017-12-25

http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

Introduction

Hadoop分散式檔案系統被設計執行在普通的硬體上。它和目前已經存在的分散式檔案系統有很多相似的地方。然而,也有很多不同。HDFS的容錯性很高,並且被設計用來執行在廉價的硬體上。HDFS提供高吞吐量的訪問應用資料,並且適合用在有很大資料集的應用。HDFS是構建Apache Nutch的基礎設施。HDFS是Apache Hadoop核心工程的一部分。

Assumptions and Goals

Hardware Failure

硬體失敗是一種正常情況而不是異常情況。一個HDFS例項可能由成千上萬臺伺服器機器組成,每臺機器都儲存著這個檔案系統上的一部分資料。事實上有許多元件,每個元件失敗的概率很大,這就意味著HDFS總是不穩定的。因此,快速刪除錯誤的元件,並且自動發現它們是HDFS的一個核心架構目標。

NameNode and DataNodes

HDFS是一個主從結構。一個HDFS叢集由一個NameNode和許多個DataNode組成。NameNode是一個主伺服器,它管理檔案系統的名稱空間,並且客戶端對檔案的訪問。DataNode管理與之相關的節點的儲存。HDFS維護一個檔案系統的名稱空間,並且允許使用者資料以檔案形式儲存。在內部,一個檔案被切分成一個或多個塊,這些塊被儲存在一系列的DataNode上。NameNode執行檔案系統名稱空間操作,比如:開啟、管理、重新命名檔案或目錄。它也維護著塊到DataNode之間的對映關係。DataNode負責為這些來自檔案系統客戶端的請求提供讀寫服務。在NameNode指定之下,DataNode也執行塊的建立、刪除、複製操作。

HDFS是用Java語言構建的,任何一個支援Java的機器上都可以執行NameNode和DataNode軟體。一種典型的部署方式是用一臺專門的機器上面只部署NameNode,而這個例項叢集中的其它的每一個叢集上都執行一個DataNode。HDFS這種架構不能阻止在同一臺叢集上執行多個DataNode,但這種情況在真實的部署中是很少見的。

The File System Namespace

HDFS的檔案系統名稱空間和已經存在的其它的檔案系統很類似,可以建立、刪除、移動檔案或目錄。HDFS支援使用者限額和訪問許可權控制。HDFS不支援硬連結和軟連結,然而它並沒有阻止這種特性的實現。

NameNode維護檔案系統名稱空間。任何對檔案系統名稱空間或者它們的屬性的修改都會記錄到NameNode中。一個應用可以指定一個檔案在HDFS中應該維護的副本的數量。一個檔案副本的數量叫做這個檔案的副本因子,這個資訊被儲存在NameNode中。

Data Replication

每個檔案被儲存為一系列的塊。為了容錯,檔案的每個塊會被複制。塊的大小和副本因子被配置在每個檔案中。在一個檔案的所有塊中,除了最後一個塊以外,其餘的塊的大小都相同。應用程式可以指定一個檔案的副本數量。在檔案被建立的時候副本因子就被指定了,當然在隨後可以修改。在HDFS中的檔案都是隻能寫一次的,而且在任何時候都是嚴格的只能寫一次。(PS:也就是說寫入了就不能改了,如果想要改則需要先下載本地修改後重新上傳)

NameNode會週期性的接收到來自叢集中的每個DataNode的心跳檢測和塊報告。收到心跳檢測意味著這個DataNode還活著可以正常提供服務。一個塊報告包含這個DataNode上的所有的塊列表。

Replica Placement: The First Baby Steps

副本存放的位置對HDFS的可靠性和效能至關重要。最佳的副本位置是HDFS區別與其它分散式檔案系統的重要標誌。這個特性需要大量的除錯和實驗。機架感知副本位置策略的目的是為了提高資料的可靠性、可用性和網路頻寬的利用率。

一個大的HDFS叢集例項由許多計算機組成,這些計算機通常被放在許多機架上。不同機架上的兩臺計算機之間通訊必須通過交換機。大多數情況下,相同機架上的機器之間的網路頻寬要比不通機架上機器之前的網路頻寬要好很多。

NameNode決定DataNode所屬的機架ID

通常情況下,副本因子是3。HDFS的放置策略是,如果是第一次寫在某個DataNode上,那麼就放置一個副本在這個DataNode所在的本地機器上,否則放置在相同機架上的一個隨機的DataNode上,其它的副本放置在不同的遠端機架上的某個節點,最後一個副本放置在相同的遠端機架上的不同的節點上。機架失敗的概率要比機架上某個節點失敗的概率小很多。這個策略不影響資料的可靠性和可用性。

如果副本因子大於3,那麼第4個以及後面的更多的副本的位置是隨機決定的,但是每個機架上的副本數量有一個上限((replicas - 1) / racks + 2

The Persistence of File System Metadata

NameNode用一個叫做EditLog的事務日誌來持久化檔案系統後設資料的每一次改變。例如,在HDFS上建立一個新檔案會造成NameNode插入一條記錄到EditLog中。同樣的,改變一個檔案的副本因子也會造成往EditLog中插入一條記錄。NameNode用它所在的主機的本地作業系統上的一個檔案來儲存EditLog。整個檔案系統名稱空間,包括塊到檔案的對映,以及檔案的系統屬性,都會被儲存到一個叫做FsImage的檔案中。這個FsImage檔案也被儲存在NameNode的本地檔案系統中。

NameNode在記憶體中保持整個檔案系統名稱空間以及檔案塊的對映。當NameNode啟動的時候,或者當檢查點被觸發的時候,它會從磁碟中讀取FsImage和EditLog,然後根據EditLog構建所有的事務到記憶體中的FsImage,並且重新整理新的版本到一個新的FsImage到磁碟。它會截斷舊的EditLog,因為這些EditLog中的事務已經被持久化到FsImage中了。這個處理被叫做檢查點。檢查點的目的在於通過做一個檔案系統後設資料的快照並且把它們儲存到FsImage中來確保HDFS可以很方便的檢視檔案系統後設資料。代替每編輯一次就修改FsImage,我們將這個編輯持久化到EditLog。當檢查點發生的時候,將改變從EditLog寫到FsImage。一個檢查點被觸發在給定的時間間隔(dfs.namenode.checkpoint.period)單位是秒,或者指定檔案系統事務累積達到多少數量(dfs.namenode.checkpoint.txns)就觸發。如果這兩個屬性都設定了,那麼第一個達到閾值的將觸發檢查點。

DataNode將檔案資料存放在本地檔案系統中。DataNode並不知道HDFS的檔案,它只是將檔案的每個塊儲存到本地檔案系統中。DataNode並不是將所有的檔案都存在一個目錄下,它會以一種啟發式的方式來決定每個目錄下該存放的檔案的最優數量,並且也會適當的建立子目錄。當DataNode啟動的時候,它通過掃描本地檔案系統生成一個和這個本地檔案一致的HDFS資料塊的列表,並且傳送報告給NameNode。這個報告叫做Blockreport。

 

總結一下:

1、每次後設資料的改變都會被記錄到EditLog中

2、檔案的後設資料已經檔案和Block直接的對映關係被記錄到FsImage中

3、改變不會理解寫到FsImage中,而是先記錄到EditLog中,然後當檢查點觸發的時候將EditLog中記錄的改變寫到FsImage中

4、檢查點觸發的時機有兩個:一個是可以通過dfs.namenode.checkpoint.period引數指定多長時間週期性的觸發一次,另一個是通過dfs.namenode.checkpoint.txns指定當EditLog中的記錄達到多少時觸發一次。無論達到那個條件都會觸發,誰先達到,誰先觸發

5、EditLog和FsImage都存放在NameNode所在的機器的本地磁碟上

6、DataNode啟動的時候回傳送BlockReport給NameNode

 

 

相關文章