Hadoop分散式檔案系統(HDFS):架構和設計
HDFS被設計成能夠在一個大叢集中跨機器可靠地儲存超大檔案。它將每個檔案儲存成一系列的資料塊,除了最後一個,所有的資料塊都是同樣大小的。為了容 錯,檔案的所有資料塊都會有副本。每個檔案的資料塊大小和副本系數都是可配置的。應用程式可以指定某個檔案的副本數目。副本系數可以在檔案建立的時候指 定,也可以在之後改變。HDFS中的檔案都是一次性寫入的,並且嚴格要求在任何時候只能有一個寫入者。
Namenode全權管理資料塊的複製,它週期性地從叢集中的每個Datanode接收心跳訊號和塊狀態報告(Blockreport)。接收到心跳訊號 意味著該Datanode節點工作正常。塊狀態報告包含了一個該Datanode上所有資料塊的列表。
副本存放: 最最開始的一步
副本的存放是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上。