Hadoop系列之六:分佈式文件系統HDFS

一、MapReduce與分佈式文件系統
前面的討論中,咱們已經得知,Hadoop中實現的MapReduce是一個編程模型和運行框架,它可以經過JobTracker接收客戶提交的做業然後將其分割爲多個任務後並行運行在多個TaskTracker上。而問題是,這些TaskTracker如何高效獲取所要處理的數據?node

在傳統的高性能集羣中,計算節點和存儲節點是各自獨立的,它們之間經過高速網絡完成互聯,然而,在面臨海量數據處理的問題時,網絡必然會成爲整個系統的性能瓶頸,這就須要引入超高速的網絡如萬兆以太網或Infiniband。然而,對大數場景來說它們屬於「奢侈品」,且昂貴的投入並不能帶來網絡性能的線性提高,所以性價比不高。面對這種問題,MapReduce採起了將計算節點與存儲節點合二爲一的集羣模型,它利用分佈式文件系統將數據存儲於多個節點上,然後讓處理過程在各數據節點本地直接進行,從而極大地下降了數據經過網絡傳送的需求。不過,這裏仍然須要說明的是,MapReduce並不是依賴於分佈式文件系統,只不過運行在非分佈式文件系統的MapReduce的諸多高級特性將無用武之地。
事實上,分佈式文件系統並不是MapReduce帶來的新生事物,只不過,MapReduce站在前人的基礎上將分佈式文件系統進行了改造以使得它更可以適用於在MapReduce中完成海量數據處理。Google爲在他們的MapReduce中實現的分佈式文件系統爲GFS(Google File System),而Hadoop的實現稱做HDFS(Hadoop Distributed File System)。編程

二、HDFS的設計理念
HDFS的許多設計思想與傳統的文件系統(如ext三、XFS等)是相似的,好比文件數據存儲於「數據塊(block)」中、經過「元數據」將文件名與數據塊創建映射關係、文件系統基於目錄實現樹狀組織結構、經過元數據保存文件權限及時間戳等。
但兩者也有不一樣之處,好比傳統文件系統實現爲系統內核(尤爲是Linux系統)中內核模塊,可經過用戶空間的相關工具進行管理操做,並可以在掛載後供用戶使用;但HDFS是一種「用戶空間文件系統」,其文件系統代碼運行於內核以外並以用戶空間進程的形式存在,故不須要在VFS(Virtual FileSystem)註冊後向用戶空間輸出,也不能掛載使用。同時,HDFS仍是一個分佈式文件系統,這意味着其工做於集羣模式中,數據塊分佈存儲於各「存儲節點(DataNode)」上,存儲空間的總體大小爲全部存儲節點貢獻出的空間之和,但元數據存儲於集羣中一個稱之爲「名稱節點(NameNode)」專用的節點上。
但兩者還有着更進一步的聯繫。HDFS是用戶空間的文件系統,其存儲空間是經過數據節點(datanode)上的DataNode進程將本地某文件系統輸出爲HDFS實現的。這意味着,在配置數據節點時,須要首先準備一個本地文件系統,其能夠是某文件系統上一個目錄或者是一個獨立的已經掛載的文件系統,如/hadoop/storage,然後經過DataNode進程的配置文件將出輸出爲HDFS便可。當客戶端存儲文件時,DataNode進程接收進來的數據會存儲在/hadoop/storage目錄中;不過,須要注意的是,不能經過/hadoop/storage直接訪問這些文件。
此外,傳統文件系統的「塊大小(block size)」經過爲1KB、2KB或4KB等,而HDFS的塊大小爲64MB,且在生產環境中使用時,此塊大小一般還會被調整爲128MB、256MB甚至是512MB等。HDFS使用塊抽象層管理文件,能夠實現將分塊分爲多個邏輯部分後分佈於多個存儲節點,也可以有效簡化存儲子系統。而對於存儲節點來講,較大的塊能夠減小磁盤的尋道次數,進而提高I/O性能。
所以,HDFS專爲存儲大文件而設計,一般以集羣模型運行於普通的商業服務器上,基於流式數據訪問模型完成數據存取。HDFS將全部文件的元數據存儲於名稱節點(NameNode)的內存中,可以利用分佈式特性高效地管理「大」文件(GB級別甚至更大的文件),對於有着海量小文件的應用場景則會給名稱節點的內存空間帶去巨大壓力並使得其極可能成爲系統性能瓶頸。再者,HDFS爲MapReduce的計算框架而設計,存儲下來數據主要用於後續的處理分析,其訪問模型爲「一次寫入、屢次讀取」;所以,數據在HDFS中存儲完成後,僅能在文件尾部附加新數據,而不能對文件進行修改。另外,HDFS專爲了高效地傳輸大文件進行了優化,其爲了完成此目標,在「低延遲」特性上作出了很大讓步,所以,其不適用於較小訪問延遲的應用。服務器

圖:HDFS架構網絡

三、HDFS的名稱節點(NameNode)和數據節點(DataNode)

HDFS集羣中節點的工做模型爲「master-worker」,其也屬於主從架構,包含一個名稱節點(master)和多個數據節點(worker)。
名稱節點負責管理HDFS的名稱空間,即以樹狀結構組織的目錄及文件的元數據信息,這些信息持久存儲於名稱節點本地磁盤上並保存爲名稱「空間鏡像(namespace image)」和「編輯日誌(edit log)」兩個文件。名稱節點並不存儲數據塊,它僅須要知道每一個文件對應數據塊的存儲位置,即真正存儲了數據塊的數據節點。然而,名稱節點並不會持久存儲數據塊所與其存儲位置的對應信息,由於這些信息是在HDFS集羣啓動由名稱節點根據各數據節點發來的信息進行重建而來。數據節點的主要任務包括根據名稱節點或客戶的要求完成存儲或讀取數據塊,並週期性地將其保存的數據塊相關信息報告給名稱節點。
默認狀況下,HDFS會在集羣中爲每一個數據塊存儲三個副本以確保數據的可靠性、可用性及性能表現。在一個大規模集羣中,這三個副本通常會保存至不一樣機架中的數據節點上以應付兩種常見的故障:單數據節點故障和致使某機架上的全部主機離線的網絡故障。另外,如前面MapReduce運行模型中所述,爲數據塊保存多個副本也有利於MapReduce在做業執行過程當中透明地處理節點故障等,併爲MapReduce中做業協同處理以提高性能提供了現實支撐。名稱節點會根據數據節點的週期性報告來檢查每一個數據塊的副本數是否符合要求,低於配置個數要求的將會對其進行補足,而多出的將會被丟棄。架構

參考文獻:框架

Data-Intensive Text Processing with MapReduce分佈式

Hadoop in prictise
Hadoop Operationside

相關文章
相關標籤/搜索