天天看點

從HDFS看分布式檔案系統的設計需求

分布式檔案系統的設計需求大概是這麼幾個:透明性、并發控制、可伸縮性、容錯以及安全需求等。我想試試從這幾個角度去觀察hdfs的設計和實作,可以更清楚地看出hdfs的應用場景和設計理念。

    首先是透明性,如果按照開放分布式處理的标準确定就有8種透明性:通路的透明性、位置的透明性、并發透明性、複制透明性、故障透明性、移動透明性、性能透明性和伸縮透明性。對于分布式檔案系統,最重要的是希望能達到5個透明性要求:

1)通路的透明性:使用者能通過相同的操作來通路本地檔案和遠端檔案資源。hdfs可以做到這一點,如果hdfs設定成本地檔案系統,而非分布式,那麼讀寫 分布式hdfs的程式可以不用修改地讀寫本地檔案,要做修改的是配置檔案。可見,hdfs提供的通路的透明性是不完全的,畢竟它建構于java之上,不能 像nfs或者afs那樣去修改unix核心,同時将本地檔案和遠端檔案以一緻的方式處理。

2)位置的透明性:使用單一的檔案命名空間,在不改變路徑名的前提下,檔案或者檔案集合可以被重定位。hdfs叢集隻有一個namenode來負責檔案系 統命名空間的管理,檔案的block可以重新分布複制,block可以增加或者減少副本,副本可以跨機架存儲,而這一切對用戶端都是透明的。

3)移動的透明性,這一點與位置的透明性類似,hdfs中的檔案經常由于節點的失效、增加或者replication因子的改變或者重新均衡等進行着複制或者移動,而用戶端和用戶端程式并不需要改變什麼,namenode的edits日志檔案記錄着這些變更。

4)性能的透明性和伸縮的透明性:hdfs的目标就是建構在大規模廉價機器上的分布式檔案系統叢集,可伸縮性毋庸置疑,至于性能可以參考它首頁上的一些benchmark。

    其次是并發控制,用戶端對于檔案的讀寫不應該影響其他用戶端對同一個檔案的讀寫。要想實作近似原生檔案系統的單個檔案拷貝語義,分布式檔案系統需要做出複 雜的互動,例如采用時間戳,或者類似回調承諾(類似伺服器到用戶端的rpc回調,在檔案更新的時候;回調有兩種狀态:有效或者取消。用戶端通過檢查回調承 諾的狀态,來判斷伺服器上的檔案是否被更新過)。hdfs并沒有這樣做,它的機制非常簡單,任何時間都隻允許一個寫的用戶端,檔案經建立并寫入之後不再改 變,它的模型是write-one-read-many, 一次寫,多次讀。這與它的應用場合是一緻,hdfs的檔案大小通常是兆至t級的,這些資料不會經常修改,最經常的是被順序讀并處理,随機讀很少,是以 hdfs非常适合mapreduce架構或者web crawler應用。hdfs檔案的大小也決定了它的用戶端不能像某些分布式檔案系統那樣緩存常用到的幾百個檔案。

    第三,檔案複制功能,一個檔案可以表示為其内容在不同位置的多個拷貝。這樣做帶來了兩個好處:通路同個檔案時可以從多個伺服器中擷取進而改善服務的伸縮 性,另外就是提高了容錯能力,某個副本損壞了,仍然可以從其他伺服器節點擷取該檔案。hdfs檔案的block為了容錯都将被備份,根據配置的 replication因子來,預設是3。副本的存放政策也是很有講究,一個放在本地機架的節點,一個放在同一機架的另一節點,另一個放在其他機架上。這 樣可以最大限度地防止因故障導緻的副本的丢失。不僅如此,hdfs讀檔案的時候也将優先選擇從同一機架乃至同一資料中心的節點上讀取block。

    第四,硬體和作業系統的異構性。由于建構在java平台上,hdfs的跨平台能力毋庸置疑,得益于java平台已經封裝好的檔案io系統,hdfs可以在不同的作業系統和計算機上實作同樣的用戶端和服務端程式。

    第五,容錯能力,在分布式檔案系統中,盡量保證檔案服務在用戶端或者服務端出現問題的時候能正常使用是非常重要的。hdfs的容錯能力大概可以分為兩個方面:檔案系統的容錯性以及hadoop本身的容錯能力。檔案系統的容錯性通過這麼幾個手段:

1)在namenode和datanode之間維持心跳檢測,當由于網絡故障之類的原因,導緻datanode發出的心跳包沒有被namenode正常收 到的時候,namenode就不會将任何新的io操作派發給那個datanode,該datanode上的資料被認為是無效的,是以namenode會檢 測是否有檔案block的副本數目小于設定值,如果小于就自動開始複制新的副本并分發到其他datanode節點。

2)檢測檔案block的完整性,hdfs會記錄每個新建立的檔案的所有block的校驗和。當以後檢索這些檔案的時候,從某個節點擷取block,會首先确認校驗和是否一緻,如果不一緻,會從其他datanode節點上擷取該block的副本。

3)叢集的負載均衡,由于節點的失效或者增加,可能導緻資料分布的不均勻,當某個datanode節點的空閑空間大于一個臨界值的時候,hdfs會自動從其他datanode遷移資料過來。

4)namenode上的fsimage和edits日志檔案是hdfs的核心資料結構,如果這些檔案損壞了,hdfs将失效。因而,namenode可以配置成支援維護多 個fsimage和editlog的拷貝。任何對fsimage或者editlog的修改,都将同步到它們的副本上。它總是選取最近的一緻的fsimage和editlog使用。namenode在hdfs是單點存在,如果namenode所在的機器錯誤,手工的幹預是必須的。

5)檔案的删除,删除并不是馬上從namenode移出namespace,而是放在/trash目錄随時可恢複,直到超過設定時間才被正式移除。

    再說hadoop本身的容錯性,hadoop支援更新和復原,當更新hadoop軟體時出現bug或者不相容現象,可以通過復原恢複到老的hadoop版本。

    最後一個就是安全性問題,hdfs的安全性是比較弱的,隻有簡單的與unix檔案系統類似的檔案許可控制,未來版本會實作類似nfs的kerberos驗證系統。

    總結下:hdfs作為通用的分布式檔案系統并不适合,它在并發控制、緩存一緻性以及小檔案讀寫的效率上是比較弱的。但是它有自己明确的設計目标,那就是支 持大的資料檔案(兆至t級),并且這些檔案以順序讀為主,以檔案讀的高吞吐量為目标,并且與mapreduce架構緊密結合。

文章轉自莊周夢蝶  ,原文釋出時間 2008-08-15 <b></b>