Hadoop源碼分析筆記(五):HDFS特點和體系結構

HDFS

        Hadoop是一個能夠讓用戶輕鬆架構和使用的分佈式計算平臺,用戶可以在Hadoop上管理、開發和運行處理大規模數據的應用,其中,Hadoop分佈式文件系統(Hadoop Distributed File System,HDFS)扮演了非常基礎的使用,它以文件系統的形式爲應用提供海量數據存儲服務。

HDFS主要特點

        HDFS作爲一個分佈式文件系統,具有高容錯的特點,它可以部署在廉價的通用硬件上,提供高吞吐率的數據訪問,適合那些需要處理海量數據集的應用程序。HDFS提供了一套特有的、基於Hadoop抽象文件系統的API,支持以流的形式訪問文件系統中的數據。
       HDFS的主要特性包括:
        1、支持超大文件。
        2、檢測和快速應對硬件故障。一般的HDFS系統是由數百臺甚至上千臺存儲着數據文件的服務器組成,這些多的服務器意味着高故障率。因此,故障檢測和自動恢復是HDFS的一個設計目標。
       3、流式數據訪問。HDFS處理的數據規模都比較大,應用一次需要訪問大量的數據。同時,這些應用一般是批量處理,而不是用戶交互式處理。HDFS使應用程序能夠以流的形式訪問數據集,注重的是數據的吞吐量,而不是數據訪問的速度。
      4、簡化的一致性模型。大部分的HDFS程序操作文件時需要一次寫入,多次讀取,在HDFS中,一個文件一旦經過創建、寫入、關閉後,一般就不需要修改了。這樣簡單的一致性模型,有利於提供高吞吐量的數據訪問模型。
       正因爲如此,HDFS並不適合如下應用:
       1、低延遲數據的訪問。由於Hadoop針對高數據吞吐量做了優化,而犧牲了獲取數據的延遲,對於低延遲訪問,可以考慮使用HBase。
       2、大量的小文件。HDFS支持超大文件,是通過將數據分佈在數據節點並將文件的元數據保持在名字節點上。名字節點的內存大小,決定了HDFS文件系統可保存的文件數量,雖然現在的系統內存都比較大,但大量的小文件還會影響名字節點的性能。
      3、多用戶寫入文件、修改文件。HDFS中的文件只能有一個寫入者,而且寫操作總是在文件末。它不支持多個寫入者,也不支持在數據寫入後,在文件的任意位置進行修改。
       總之,HDFS是以流失數據訪問模式存儲超大文件而設計的文件系統,並在普通商用硬件集羣上運行。

HDFS體系結構

        爲了支持流式數據訪問和存儲超大文件,HDFS引入了一些比較特殊的設計,在一個全配置的集羣上,”運行HDFS“意味着網絡分佈的不同服務器上運行一些守護進程(Daemon),這些進程有各自的特殊角色,並相互配合,一起形成一個分佈式文件系統。
       HDFS採用了主從(Master/Slave)體系機構,名字節點NameNode、數據節點DataNode和客戶端Client是HDFS中的3個重要角色。
       名稱節點可以看作是分佈式文件系統中的管理者,它負責管理文件系統命名空間、集羣設置和數據塊複製等。
       數據節點是文件存儲的基本單元,它以數據塊的形式保存了HDFS中文件的內容和數據塊的數據塊的數據效驗信息。
       客戶端和名字節點、數據節點通信,訪問HDFS文件系統,操作文件。
數據塊(Block)
       HDFS是針對大文件設計的分佈式系統,使用數據塊帶來了很多的好處,
       1、HDFS可以保存比存儲節點單一磁盤大的文件。
       2、簡化了存儲子系統。
       3、方便容錯,有利於數據複製。在HDFS中,爲了應對損壞的塊以及磁盤、機器故障,數據塊會在不同的機器上進行副本(一般副本數爲3,即一份數據保存在3個不同的地方),如果一個數據塊副本丟失或者損壞了,系統會在其他地方讀取副本,在這個過程對用戶來說是透明的,它實現了分佈式系統中的位置透明性和故障透明性。同時,一個因損壞或機器故障而丟失的塊會從其他地方複製到某一個正常的運行機器上面,以保證副本數據恢復到正常水平。
名字節點(NameNode)和第二名字節點(Secondary NameNode)
        名字節點是從HDFS主從結構中主節點上面運行的主要進程,它指導主從結構中的從節點,數據節點(DataNode)執行底層的I/O任務。
        名字節點是HDFS的書記員,維護着整個文件系統的文件目錄樹,文件/目錄的元信息和文件的數據塊索引,即每個文件對應的數據塊列表(上述關係也成名字節點第一關係)。這些信息以兩種形式存儲在本地文件系統中:一種是命名空間鏡像(File System Image,FSImage,也稱文件系統鏡像),另一種是命名空間鏡像的編輯日誌(EditLog);
        命名空間鏡像保持着某一特定時刻HDFS的目錄樹、元信息和數據塊索引等信息,後續對這些信息的改動,則保存在編輯日誌中,它們一起提供了一個完整的名字節點第一關節。名字節點中與數據節點相關的信息不保留在名字節點的本地文件系統中,也就是上面提到的命名空間鏡像和編輯日誌中,名字節點每次啓動時,都會動態地重建這些信息,這些信息構成了名字節點第二關係。運行時,客戶端通過名字節點獲取上述信息,然後和數據節點進行交互,讀寫文件數據。另外,名字節點還能獲取HDFS整形運行狀態的一些信息,如系統的可用空間、已經使用的空間、各數據節點的當前狀態等。
       第二名字節點是用於定期合併命名空間鏡像和鏡像編輯日誌的輔助守護進程。和名字節點一樣,每個集羣都有一個第二名字節點,在大規模部署的條件下,一般第二名字也獨自佔用一臺服務器。

        第二名字節點和名字節點的區別在於它不接收或記錄HDFS的任何實時變化,而只是根據集羣配置的時間間隔,不停地獲取HDFS某一個時間點的命名空間鏡像和鏡像的編輯日誌,合併並得到一個新的命名空間鏡像,該新鏡像會上傳到名字節點,替換原有的命名空間鏡像,並請空上述日誌。應該說,第二名字節點配合名字節點,爲名字節點上的第一關係提供了一個簡單的檢查點機制,並避免出現編輯日誌過大,導致名字節點啓動時間過長的問題。

數據節點(DataNode)
         HDFS集羣上的從節點都會駐留一個數據節點的守護進程,來執行分佈式文件系統中最忙碌的部分:將HDFS數據塊寫到Linux本地文件系統的實際文件中,或者從這些實際文件讀取數據塊。
         雖然HDFS是爲大文件設計,但存放在HDFS上的文件盒傳統文件系統類似,也是將文件分塊,然後進行存儲。但和傳統文件系統不同,在數據節點上,HDFS文件塊以Linux文件系統上的普通文件進行保存。客戶端進行文件內容操作時,先由名字節點告知客戶端每個數據塊駐留在哪個數據節點,然後客戶端直接與數據節點守護進程進行通信,處理與數據塊對應的本地文件。同時,數據節點會和其他數據節點進行通信,複製數據塊,保證數據的冗餘性。
客戶端
        客戶端是用戶和HDFS進行交互的手段,HDFS提供了各種各樣的客戶端,包括命令行接口,Java API、Thrift接口、C等。
        Hadoop提供了一套和Linux文件命令類似的命令行工具。
        命令行工具提供了訪問HDFS的基本能力,HDFS的Java API提供了更進一步的功能。目前,所有訪問HDFS的接口都是基於Java API。Java API實現了上一章介紹的Hadoop抽象文件系統,包括DistributedFileSystem和對應的輸入和輸出流。
         DistributedFileSystem繼承自org.apche.hadoop.fs.FileSystem,實現了Hadoop文件系統界面,提供了處理HDFS文件和目錄的相關事務,DFSDataInputStream和DFSDataOutputStream分別實現了FSDataInoutStream和FSDataOutputStream,提供了讀寫HDFS文件的輸入/輸出流。
         
          
//HDFS Java API實例
Path inPath=new Path("hdfs://<ip>:<port>/user/alice/in/hello.txt");
FileSystem hdfs=FileSystem.get(inPath.toUri(),conf);
FSDataOutputStream fout=hdfs.create(inPath);
String data="test";
for(ing i=0;i<100;i++){
   fout.write(data.getBytes());
}
fout.close();
FileStatus stat=hdfs.getFileStatus(inPath);
System.out.println("副本數:"+stat.getReplication());
hdfs.delete(inPath);
       HDFS正是通過Java的客戶端,屏蔽了訪問HDFS的各種各樣細節,用戶通過標準的Hadoop文件接口,就可以訪問複雜的HDFS,而不需要考慮名字節點、數據節點等的交互細節,降低了Hadoop應用開發的難度,也證明了Hadoop抽象文件系統的通用性。

       版權申明:本文部分摘自【蔡斌、陳湘萍】所著【Hadoop技術內幕 深入解析Hadoop Common和HDFS架構設計與實現原理】一書,僅作爲學習筆記,用於技術交流,其商業版權由原作者保留,推薦大家購買圖書研究,轉載請保留原作者,謝謝!
 

發佈了1 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章