1. 程式人生 > >官方HDFS架構設計原理說明(上)

官方HDFS架構設計原理說明(上)

玩了HDFS已經有好多年了,之前一直都是邊學邊用,直到現在才真正有時間記錄一下學到的知識O(∩_∩)O

1. 引言


HDFS全稱是Hadoop Distributed File System,Hadoop分散式檔案系統,顧名思義它是一個分散式的檔案系統,設計於執行在普通硬體之上。它和現在的分散式檔案系統有很多相似點,但是它們的區別也是很明顯的。HDFS是高容錯的,被設計於執行在廉價的硬體之上。HDFS能提供高吞吐量的資料訪問,適合大規模資料集上的應用。HDFS放寬了一部分POSIX的約束,來實現流式讀取檔案系統的資料。HDFS在最開始是作為Apache Nutch搜尋引擎專案的基礎架構而開發的,它是Apache Hadoop核心專案的一部分。

2. 假設和目標

2.1 硬體故障


硬體故障是普遍的,而不應是異常情況。一個HDFS系統可以由數百或數千個伺服器組成,每一個伺服器都儲存著部分的檔案系統資料。事實上HDFS是由大量的元件組成,每一個元件都很可能出現故障,這意味著HDFS裡面總會有些元件是不能正常工作的。因此,故障的檢測和快速自動恢復是HDFS的一個核心架構設計目標。

2.2 流式資料訪問

執行在HDFS之上的應用必須流式地訪問它們的資料集,它們不是執行在一般檔案系統的普通應用。HDFS被設計為更適合批量處理而不是被使用者互動式使用,它的重點在於高吞吐量的資料訪問而不是低延時的資料訪問。POSIX的很多硬性需求對於HDFS的應用來說是非必要的,所以為了提高資料吞吐量比率,HDFS放寬了一部分POSIX的約束。

2.3 大資料集


執行在HDFS之上的應用有大量的資料集。在HDFS裡面,典型的檔案大小是GB到TB的級別,因此,HDFS被設計成支援儲存大檔案。它應該提供很高的聚合資料頻寬、支援在一個叢集裡面擴充套件到數百個節點和儲存上千萬個檔案。

2.4 簡單一致性模型

HDFS應用對檔案的操作需求是一次寫入多次讀取的訪問模式。一個檔案一旦被建立、寫入和關閉之後,除了追加和截斷內容之外,不需要修改。內容的追加是支援的但不能在任意點修改更新檔案,這個假設簡化了資料一致性的問題並使高吞吐量的資料訪問變得可能。一個MapReduce的應用或者網路爬蟲應用十分適用於該模型。

2.5 “移動計算比移動資料更經濟”


在靠近資料所儲存的位置來進行計算會更加有效率,特別是在計算大資料集的時候,這樣可以減少網路的擁堵和提高系統的整體吞吐量。這個假設是通常遷移計算到離資料更近的位置比將資料移動到程式執行更近的位置要更有效。HDFS提供了讓應用程式將自己移動到離資料儲存更近位置的介面。

2.6 異構軟硬體平臺間的可移植性


HDFS被設計成可以容易地實現平臺間的遷移,這將有助於HDFS被廣泛地採用為大型應用程式的首選平臺。

3. 命名節點NameNode和資料節點DataNodes

HDFS使用主從架構。一個HDFS叢集是由一個NameNode和多個DataNode組成,NameNode是一個管理檔案系統名稱空間和調節客戶端訪問檔案的主伺服器,DataNode是管理對應節點的儲存,通常是一個伺服器部署一個DataNode。內部地,一個檔案被分割為一個或多個數據塊,這些資料塊被儲存在不同的DataNode。NameNode用於操作檔案系統的名稱空間,例如開啟、關閉和重新命名檔案和目錄,同時決定了資料塊和DataNode的對映關係。DataNode用於處理資料的讀寫請求,同時執行資料塊的建立,刪除和來自NameNode的複製指令。



NameNode和DataNode都是被設計為可執行在普通伺服器之上的軟體,這些伺服器通常都是使用GNU/Linux的作業系統。HDFS是用Java語言構建的,任何支援Java的伺服器都可以啟動NameNode和DataNode服務。使用高度可移植的Java語言意味著HDFS可以部署在廣泛的機器上。一個典型的部署方式是單獨啟動NameNode在一臺伺服器,叢集的其餘每一臺伺服器都啟動一個DataNode。也可以把多個DataNode部署在同一臺伺服器,但在實際的生產環境是不建議的。

叢集使用NameNode來大大簡化了系統的架構,它是叢集的仲裁者和所有HDFS元資料的儲存庫。系統採用如此的設計方式使得使用者的資料不會流經NameNode。

4. 檔案系統名稱空間

HDFS支援傳統的分層檔案組織結構。一個使用者或應用可以建立目錄並把檔案儲存在這些目錄中。HDFS檔案系統的名稱空間層次結構與其它大多數現有的檔案系統類似; 可以建立和刪除檔案,把檔案從一個目錄移到另一個目錄,或重新命名檔案。HDFS支援使用者配額和訪問許可權,但不支援硬連結或軟連結。然而,HDFS架構並不排除在將來實現這些功能。

NameNode維護檔案系統的名稱空間,檔案系統名稱空間或其屬性的任何修改都會被NameNode記錄。應用程式可以指定檔案的副本數,該數值被稱為檔案的複製因子,這些資訊會由NameNode負責儲存。

5. 資料複製

HDFS被設計為用於在大型叢集中的伺服器之間可靠地儲存非常大的檔案。它把每一個檔案儲存為序列的塊,這些序列塊會被複制用於容錯,每個檔案的塊大小和複製因子是可以配置的。同一檔案中除了最後一個塊之外,其它塊的大小都是相同的,而在DistributedFileSystem.append和HdfsDataOutputStream.hsync方法支援引數flag後,使用者可以隨時新建一個塊而不是預設地往最後一個塊新增資料直到配置的塊大小上限為止。

應用程式可以指定檔案的副本數,複製因子可以在建立檔案的時候指定,也可以在建立之後修改。HDFS中的檔案是一次寫入的(除了追加和截斷之外),並且在任何時候都只有一個寫操作。NameNode負責塊複製的所有決策,它週期地接收叢集中每個DataNode的心跳和塊報告Blockreport,收到心跳意味著DataNode是正常工作的。一份Blockreport包含該DataNode所有塊的列表。



5.1 副本存放位置

副本的存放位置是會嚴重影響HDFS的可靠性和效能,它的優化是HDFS區分於其他分散式檔案系統的的特點。HDFS使用機架感知rack-aware副本放置策略,它的意圖是提高資料可靠性,可用性和網路頻寬的利用率。目前的副本放置策略的實現是朝著這個方向努力的第一步,實現這一策略的短期目標是在生產系統上進行驗證,更多地瞭解其行為,併為對更復雜的策略進行測試和研究奠定基礎。

大型HDFS例項通常執行在跨多個機架上的伺服器叢集。不同機架上的兩個節點是通過交換機實現通訊的,在大多數情況下,在同一機架上的伺服器網路頻寬要優於在不同機架上的伺服器網路頻寬。

NameNode通過Hadoop機架感知確定每個DataNode所屬的機架ID。一個簡單但不是最優的策略是將副本放在不同的機架上,這樣可以防止當整個機架發生故障時丟失資料,並且在讀取資料時可以使用不同機架的頻寬。該策略把副本均勻地分佈到叢集中,使得在元件故障的時候能夠容易地實現負載均衡。但是,這種策略會對寫效能造成負影響,因為寫的時候需要把資料塊傳輸到多個不同的機架。

一般情況下,當副本數設定為3時,HDFS的副本放置策略是將一個副本放在本地節點,第二個副本放在同一機架的不同節點,第三個副本放在不同機架上。該策略減少機架間的寫流量,提高了寫效能。機架故障的機率遠遠低於節點的故障,該策略不會影響資料的可靠性和可用性保證。然而,當讀資料的時候會減少網路頻寬的使用,因為資料塊僅存在兩個不同的機架,而不是三個。檔案的副本不是均勻地分佈在不同的機架上,三分之一的副本在同一個節點,三分之二的副本在同一個機架,另外三分之一均勻地分佈在其餘的機架上。這種策略提高了寫效能,而且不會影響資料的可靠性和讀效能。

目前,這裡描述的預設副本放置策略還處於開發之中。

5.2 副本選擇

為了儘量減小全域性頻寬的消耗和讀延時,HDFS會嘗試從離請求最近的副本讀取資料。如果在同一個機架有請求資料的副本,就直接讀取,如果HDFS叢集是部署在多個數據中心,那麼會優先讀取本地資料中心的副本,而不是遠端的副本。

5.3 安全模式

在HDFS啟動的時候,NameNode會進入一個叫安全模式Safemode的特別狀態,在此模式下,資料塊還不會被複制。NameNode接收來自DataNodes的心跳和Blockreport資訊,一份Blockreport包含該DataNode所有塊的列表。每一個塊有一個特定的最小複製數,當資料塊的最小複製數被NameNode檢查後,就認為是複製成功。當達到配置的塊複製安全比例時(加上額外的30秒),NameNode就退出安全模式狀態。然後,它會檢測資料塊的列表,把少於指定數量副本的資料塊複製到其它的DataNodes。

* 參考HDFS架構(2.7.3版本)官方連結:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

TO BE CONTINUED...O(∩_∩)O