官术网_书友最值得收藏!

任務1 HDFS入門

關鍵步驟如下。

認知文件系統以及HDFS文件系統。

了解HDFS文件系統存儲的優缺點。

認識HDFS的基本概念。

掌握HDFS的體系架構。

2.1.1 認識HDFS

1.HDFS產生背景

我們在上一章已經了解到當今世界產生的數據量越來越大,那么與之相對應的需要存儲和處理的數據量也就越來越大。我們平時使用的操作系統的存儲空間是有限的,根本存儲不了那么多的數據,那么是否能把多個操作系統綜合成為一個大的操作系統,然后把數據存儲在這個大的系統中呢?這種方法其實是可行的,但卻不方便管理和維護。因此,迫切需要一種系統來管理分散存儲在多臺機器上的文件,于是就產生了分布式文件管理系統(Distributed File System,DFS)。

那么到底什么是分布式文件系統?分布式文件系統允許將一個文件通過網絡在多臺主機上以多副本(提高容錯性)的方式進行存儲,實際上是通過網絡來訪問文件,用戶和程序看起來就像是訪問本地的磁盤一樣。

2.HDFS簡介

HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,用于分布式計算中的數據存儲。Hadoop官方給出的描述是:HDFS可以運行在廉價的服務器上,為海量數據存儲提供了高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率等特征。說到HDFS,就不得不提Google的GFS,HDFS就是基于它的開源實現。

Hadoop整合了眾多的底層文件系統,如本地文件系統、HDFS文件系統、S3文件系統,并提供了一個文件系統抽象類org.apache.hadoop.fs.File System,對應的具體實現類如表2-1所示。

表2-1 Hadoop的文件系統

Hadoop提供了許多文件系統的接口,用戶可以使用URI方案選取合適的文件系統來實現交互。

3.HDFS的優點

(1)處理超大文件。這里的超大文件通常是指MB到TB量級的數據文件,Hadoop并不怕文件大;相反,如果HDFS中存在眾多的小文件,那么反而會導致Hadoop集群的性能有所下降。

(2)運行于廉價機器上。Hadoop集群可以部署在普通的廉價機器之上,而無需部署在價格昂貴的小型機上,這可以降低公司的運營成本。但要是運行在廉價的機器上,出現故障該怎么辦呢?這就要求HDFS自身要做到高可用、高可靠。

(3)流式地訪問數據。HDFS提供一次寫入、多次讀取的服務。比如你在HDFS上存儲了一個要處理的問題,后續可能會有多個作業都要使用到這份數據,那么只需要通過集群來讀取前面已經存儲好的數據即可。HDFS設計之初是不支持對文件追加內容的,但隨著Hadoop社區的發展,現在已支持對已有文件進行內容的追加。

4.HDFS的缺點

(1)不適合低延遲數據訪問。HDFS本身是為存儲大數據而設計的,如果你在工作中遇到的是低延時的應用請求,那么HDFS不適合。實時性、低延遲的查詢使用HBase會是更好的選擇,但是HBase中的rowkey設計得是否合適也會決定你的查詢性能的高低。

(2)無法高效存儲大量小文件。HDFS中的元數據(元數據信息包括:文件和目錄自身的屬性信息,例如文件名、目錄名、父目錄信息、文件大小、創建時間、修改時間等,記錄與文件內容存儲相關的信息,例如文件塊情況、副本個數、每個副本存放在哪兒等)存放在Name Node中,所以HDFS所能容納的文件數目由Name Node的內存大小決定。一旦集群中的小文件過多,會導致Name Node的壓力陡增,進而影響到集群的性能。所以可以采用Sequence File等方式對小文件進行合并,或者是使用Name Node Federation的方式來改善。

5.HDFS的設計目標

HDFS的設計目標的詳細描述可以參考Hadoop的官方文檔:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Hdfs Design.html#Introduction。本節只挑選幾個重要的設計目標進行講解。

(1)硬件錯誤。硬件錯誤是常態而不是異常。HDFS可能由成百上千個服務器所構成,每個服務器上存儲著文件系統的部分數據。事實上構成系統的組件數目是非常巨大的,而且任一個組件都有可能失效,這意味著總有一部分HDFS組件是不工作的。因此錯誤檢測和快速、自動的恢復是HDFS最核心的架構目標。

(2)大規模數據集。運行在HDFS上的應用具有很大的數據集。HDFS上的一個典型文件的大小一般都在GB至TB量級。因此,需要調節HDFS以支持大文件存儲。HDFS應該能提供整體較高的數據傳輸帶寬,能在一個集群里擴展到數百個節點。一個單一的HDFS實例應該能支撐數以千萬計的文件。

(3)移動計算代價比移動數據代價低。一個作業的計算,離它操作的數據越近就越高效,在數據達到海量級別的時候更是如此。因為這樣能降低網絡阻塞的影響,提高系統數據的吞吐量。將計算移動到數據附近,比將數據移動到應用附近顯然更好。HDFS為應用提供了將計算移動到數據附近的接口。

2.1.2 HDFS基礎

HDFS體系結構

1.數據塊(Block)

HDFS默認的最基本的存儲單位是數據塊(Block),默認的塊大小(Block Size)是64MB(有些發布版本為128MB)。HDFS中的文件是分成以Block Size為大小的數據塊存儲的。如果一個文件小于一個數據塊的大小,并不占用整個數據塊存儲空間,文件大小是多大就占用多少存儲空間。HDFS與Block的關系如圖2.1所示。

圖2.1 HDFS與Block的關系

2.元數據節點(Name Node)

Name Node的職責是管理文件系統的命名空間,它將所有的文件和文件夾的元數據保存在一個文件系統樹中,如一個文件包括哪些數據塊,這些數據塊分布在哪些數據節點上,這些信息都要存儲下來。

Name Node目錄結構如下所示。

${dfs.name.dir}/current/VERSION

   /edits

   /fsimage

   /fstime

目錄結構描述如下。

(1)VERSION文件是存放版本信息的文件,它保存了HDFS的版本號。

(2)edits:當文件系統客戶端進行寫操作時,首先記錄在修改日志中,元數據節點在內存中保存了文件系統的元數據信息。在記錄了修改日志后,元數據節點則修改內存中的數據結構。每次寫操作成功之前,修改日志都會同步到文件系統。

(3)fsimage文件即名字空間文件。

3.數據節點(Data Node)

Data Node是文件系統中真正存儲數據的地方,一個文件被拆分成多個Block后,會將這些Block存儲在對應的數據節點上。客戶端向Name Node發起請求,然后到對應的數據節點上寫入或者讀出對應的數據Block。

Data Node目錄結構如下所示。

${dfs.name.dir}/current/VERSION

 /blk_<id_1>

 /blk_<id_1>.meta

 /blk_<id_2>

 /blk_<id_2>.meta

 /...

 /blk_<id_64>

 /blk_<id_64>.meta

 /subdir0/

 /subdir1/

 /...

 /subdir63/

目錄結構描述如下。

(1)blk_<id>保存的是HDFS的數據塊,其中保存了具體的二進制數據。

(2)blk_<id>.meta保存的是數據塊的屬性信息:版本信息、類型信息和校驗和。

(3)subdirxx:當一個目錄中的數據塊達到一定數量的時候,則創建子文件夾來保存數據塊及數據塊屬性信息。

4.從元數據節點(Secondary Name Node)

Secondary Name Node并不是Name Node節點出現問題時的備用節點,它和元數據節點分別負責不同的功能。其主要功能就是周期性地將Name Node的namespace image和edit log合并,以防日志文件過大。合并后的namespace image也在元數據節點保存了一份,以防在Name Node失效的時候進行恢復。

Secondary Name Node目錄結構如下所示。

${dfs.name.dir}/current/VERSION

   /edits

   /fsimage

   /fstime

   /previous.checkpoint/VERSION

   /edits

   /fsimage

   /fstime

Secondary Name Node用來幫助Name Node將內存中的元數據信息checkpoint到硬盤上。

2.1.3 HDFS架構

1.架構概述

HDFS架構詳細描述參見http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Hdfs Design.html#Name Node_and_Data Nodes。

HDFS采用master/slave架構。一個HDFS集群由一個Name Node和一定數量的Data Node組成。Name Node是一個中心服務器,負責管理文件系統的名字空間(namespace)以及客戶端對文件的訪問。集群中的Data Node一般是一個節點對應一個,負責管理它所在節點上的存儲數據。HDFS暴露了文件系統的名字空間,用戶能夠以文件的形式在上面存儲數據。從內部看,一個文件其實被分成一個或多個數據塊,這些塊存儲在一組Data Node上。Name Node執行文件系統的名字空間操作,比如打開、關閉、重命名文件或目錄,它也負責確定數據塊到具體Data Node的映射。Data Node負責處理文件系統客戶端的讀寫請求,在Name Node的統一調度下進行數據塊的創建、刪除和復制。HDFS架構如圖2.2所示。

2.架構組件功能

Name Node和Data Node被設計成可以在普通的商用機器上運行,這些機器一般運行著GNU/Linux操作系統(OS)。由于采用了可移植性極強的Java語言,HDFS可以部署到多種類型的機器上,任何支持Java的機器都可以部署Name Node或Data Node。一個典型的部署場景是一臺機器上只運行一個Name Node實例,而集群中的其他機器分別運行一個Data Node實例。這種架構并不排斥在一臺機器上運行多個Data Node,只不過這樣的情況比較少見。

圖2.2 HDFS架構

文件系統的名字空間:HDFS支持傳統的層次型文件組織結構。用戶或者應用程序可以創建目錄,然后將文件保存在這些目錄里。文件系統名字空間的層次結構和大多數現有的文件系統類似,用戶可以創建、刪除、移動或重命名文件。當前,HDFS不支持用戶磁盤配額和訪問權限控制,也不支持硬鏈接和軟鏈接。但是HDFS架構并不妨礙對這些特性的實現。

Name Node負責維護文件系統的名字空間,任何對文件系統名字空間或屬性的修改都將被Name Node記錄下來。應用程序可以設置HDFS保存的文件的副本數目,文件副本的數目稱為文件的副本系數,這個信息也是由Name Node保存的。

主站蜘蛛池模板: 三台县| 通江县| 枝江市| 楚雄市| 竹北市| 厦门市| 武强县| 鲜城| 建水县| 佛冈县| 司法| 阳朔县| 新巴尔虎左旗| 牡丹江市| 靖边县| 孝昌县| 芮城县| 深圳市| 维西| 茶陵县| 达拉特旗| 湘阴县| 白水县| 保定市| 石狮市| 潮州市| 奉节县| 麦盖提县| 九台市| 玉山县| 五华县| 老河口市| 桐庐县| 松滋市| 义马市| 抚顺市| 平定县| 凌海市| 贡山| 宁明县| 南召县|