1. 程式人生 > >Hadoop分散式檔案系統:HDFS架構和設計(3)

Hadoop分散式檔案系統:HDFS架構和設計(3)

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

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

HDFS Datanodes

副本存放: 最最開始的一步

副本的存放是HDFS可靠性和效能的關鍵。優化的副本存放策略是HDFS區分於其他大部分分散式檔案系統的重要特性。這種特性需要做大量的調優,並需要經驗的積累。HDFS採用一種稱為機架感知(rack-aware)的策略來改進資料的可靠性、可用性和網路頻寬的利用率。目前實現的副本存放策略只是在這個方向上的第一步。實現這個策略的短期目標是驗證它在生產環境下的有效性,觀察它的行為,為實現更先進的策略打下測試和研究的基礎。

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

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

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

當前,這裡介紹的預設副本存放策略正在開發的過程中。

副本選擇

為了降低整體的頻寬消耗和讀取延時,HDFS會盡量讓讀取程式讀取離它最近的副本。如果在讀取程式的同一個機架上有一個副本,那麼就讀取該副本。如果一個HDFS叢集跨越多個數據中心,那麼客戶端也將首先讀本地資料中心的副本。

安全模式

Namenode啟動後會進入一個稱為安全模式的特殊狀態。處於安全模式的Namenode是不會進行資料塊的複製的。Namenode從所有的 Datanode接收心跳訊號和塊狀態報告。塊狀態報告包括了某個Datanode所有的資料塊列表。每個資料塊都有一個指定的最小副本數。當Namenode檢測確認某個資料塊的副本數目達到這個最小值,那麼該資料塊就會被認為是副本安全(safely replicated)的;在一定百分比(這個引數可配置)的資料塊被Namenode檢測確認是安全之後(加上一個額外的30秒等待時間),Namenode將退出安全模式狀態。接下來它會確定還有哪些資料塊的副本沒有達到指定數目,並將這些資料塊複製到其他Datanode上。