HDFS初探之旅(一)

 

一、HDFS簡介                                                                                                                                                                                         html

  HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文的需求而開發的,能夠運行於廉價的商用服務器上。它所具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集合的應用帶來了不少便利。java

  Hadoop整合了衆多文件系統,在其中有一個綜合性的文件系統抽象,它提供了文件系統實現的各種接口,HDFS只是這個抽象文件系統的一個實例。Hadoop提供了一個高層的文件系統抽象類org.apache.hadoop.fs.FileSystem,這個抽象類展現了一個分佈式文件系統,並有幾個具體的實現,如表1-1所示。node

表1-1 Hadoop文件系統數據庫

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

 

二、HDFS基礎概念                                                                                                                                                                                 緩存

2.1 數據庫(block)安全

  • HDFS(Hadoop Disturbbuted File System)默認的最基本的存儲單位是64M的數據塊;
  • 和普通文件系統相同的是,HDFS的文件是被分紅64M的數據塊存儲的;
  • 不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間;  

2.2 NameNode和DataNode服務器

  HDFS體系結構中有兩類節點,一類是NameNode,又叫「元數據節點」;另外一類是DataNode,又叫「數據節點」。這兩類節點分別是承擔Master和Worker具體任務的執行節點。網絡

  1)元數據節點用來管理文件系統的命名空間數據結構

  • 其將全部的文件和文件夾的元數據保存在一個文件系統樹中;
  • 這些信息也會在硬盤上保存成如下文件:命名空間鏡像(namespace image)及修改日誌(edit log);
  • 其還保存了一個文件包括哪些數據塊,分佈在哪些數據節點上,然而這些信息並不存儲在硬盤上,而是在系統啓動的時候從數據節點收集而成的;      

  2)數據節點是文件系統中真正存儲數據的地方

  • 客戶端(client)或者元數據信息(namenode)能夠向數據節點請求寫入或者讀出數據塊;
  • 其週期性的向元數據節點彙報其存儲的數據塊信息;  

  3)從元數據節點(secondary namenode)

  • 從元數據節點並非元數據節點出現問題時候的備用節點,它和元數據節點負責不一樣的事情;
  • 其主要功能就是週期性將元數據節點的命名空間鏡像文件盒修改日誌合併,以防日誌文件過大(這點在下面會詳細敘述);
  • 合併事後的命名空間鏡像文件也在元數據節點保存了一份,以防元數據節點失敗的時候,能夠恢復;  

2.3 元數據節點目錄結構

  

  VERSION文件是java properties文件,保存了HDFS的版本號。

  • layoutVersion是一個負整數,保存了HDFS的持續化在硬盤上的數據結構的格式版本號;
  • namespaceID是文件系統的惟一標識符,是在文件系統初次格式化時生成的;
  • Ctime此處爲0;
  • storageType表示此文件夾中保存的是元數據節點的數據結構;  

  

2.4 數據節點的目錄結構

  

  • blk_<id>保存的是HDFS的數據塊,其中保存了具體的二進制數據;
  • blk_<id>.meta保存的是數據塊的熟悉信息:版本信息、類型信息、checksum;
  • 當一個目錄中的數據塊到達必定數量的時候,則建立子文件夾來保存數據塊及數據塊屬性信息;

2.5 文件系統命名空間映像文件及修改日誌

  • 當文件系統客戶端(client)進行寫操做時,首先把它記錄在修改日誌中(edit log);
  • 元數據節點在內存中保存了文件系統的元數據信息,在記錄了修改日誌後,元數據節點在修改內存中的數據結構;
  • 每次寫操做成功以前,修改日誌都會同步(sync)到文件系統;
  • fsimage文件,也即命名空間映像文件,是內存中的元數據在硬盤上的checkpoint,它是一種序列化的格式,並不能在硬盤上直接修改;
  • 同數據的機制類似,當元數據節點失敗時,則最新checkpoint的元數據信息從fsimage加載到內存中,而後逐一從新執行修改日誌中的操做;
  • 從元數據節點就是用來幫助元數據節點將內存中的元數據信息checkpoint到硬盤上的;
  • checkpoint的過程以下:
    • 從元數據節點通知元數據節點生成新的日誌文件,之後的日誌都寫到新的日誌文件中;
    • 從元數據節點用http get從元數據節點獲取fsimage文件及舊的日誌文件;
    • 從元數據節點將fsimage文件加載到內存中,並執行日誌文件中的操做,而後生成新的fsimage文件;
    • 從元數據節點將新的fsimage文件用http post傳回元數據節點;
    • 元數據節點能夠將舊的fsimage文件及舊的日誌文件,換爲新的fsimage文件盒新的日誌文件(第一步生成的),而後更新fsimage文件,寫入這次checkpoint的時間;
    • 這樣元數據節點中的fsimage文件保存了最新的checkpoint的元數據信息,日誌文件也從新開始,不會變的很大了;    

  

 

三、HDFS體系結構                                                  

  HDFS是一個主/從(Master/Slave)體系結構,從最終用戶的角度來看,它就像傳統的文件系統同樣,能夠經過目錄路徑對文件執行CRUD(Create、Read、Update、Delete)操做。但因爲分佈式存儲的性質,HDFS集羣擁有一個NameNode和一些DataNode。NameNode管理文件系統的元數據,DataNode存儲實際的數據。客戶端經過同NameNode和DataNodes的交互訪問文件系統。客戶端聯繫NameNode以獲取文件的元數據,而真正的文件I/O操做是直接和DataNode進行交互的。

   

圖3-1 Hadoop的體系結構

  1)NameNode、DataNode和Client

  • NameNode能夠看做是分佈式文件系統中的管理者,主要負責管理文件系統的命名空間、集羣配置信息和存儲塊的複製等。NameNode會將文件系統的Metadata存儲在內存中,這些信息主要包括了文件信息、每個文件對應的文件塊的信息和每個文件塊在DataNode的信息等;
  • DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Metadata,同時週期性的將全部存在的Block的信息發送給NameNode;
  • Client就是須要獲取分佈式文件系統文件的應用程序;

  2)文件寫入

  • Client向NameNode發起文件寫入的請求;
  • NameNode根據文件大小和文件塊配置狀況,返回給Client它所管理部分DataNode的信息;
  • Client將文件劃分爲多個Block,根據DataNode的地址信息,按順序寫入到每個DataNode塊中;  

  3)文件讀取

  • Client向NameNode發起文件讀取的請求;
  • NameNode返回文件存儲的DataNode的信息;
  • Client讀取文件信息;  

 

  HDFS典型的部署是在一個專門的機器上運行的NameNode,集羣中的其餘機器各運行一個DataNode;也能夠在運行NameNode的機器上同時運行DataNode,或者一臺機器上運行多個DataNode。一個集羣只有一個NameNode的設計大大簡化了系統架構。

 

四、HDFS的優缺點                                                 

4.1 HDFS的優勢

  1)處理超大文件

  這裏的超大文件一般是指百MB、甚至數百TB大小的文件。目前在實際應用中,HDFS已經能用來存儲管理PB級的數據了。

  2)流式的訪問數據

  HDFS的設計創建在更多地響應「一次寫入、屢次讀寫」任務的基礎上。這意味着一個數據集一旦由數據源生成,就會被複製分發到不一樣的存儲節點中,而後響應各類各樣的數據分析任務請求。在多數狀況下,分析任務都會涉及數據集中的大部分數據,也就是說,對HDFS來講,請求讀取整個數據集要比讀取一條記錄更加高效

  3)運行於廉價的商用機器集羣上

  Hadoop設計對硬件需求比較只需要運行在低廉的商用硬件集羣上,而無需昂貴的高可用性機器上。廉價的商用機器也就意味着大型集羣中出現節點故障狀況的機率很是高。這就要求設計HDFS時要充分考慮數據的可靠性、安全性及高可用性。

4.2 Hadoop的缺點

  1)不適合低延遲數據訪問

  若是要處理一些用戶要求時間比較短的低延遲應用請求,則HDFS不適合。HDFS是爲處理大型數據集分析任務主要是爲達到數據吞吐量而設計的,這就可能要求以高延遲做爲代價。

  改進策略對於那些有低延遲要求的應用程序,HBase是一個更好的選擇。經過上層數據管理項目來儘量地補充這個不足。在性能上有了很大的提高,它的口號就是goes real time。使用緩存或多master設計能夠下降client的數據請求壓力,以減小延遲。還有就是對HDFS系統內部的修改,這就得權衡大吞吐量與低延遲了,HDFS不是萬能的。

  2)沒法高效存儲大量小文件

  由於NameNode把文件系統的元數據放置在內存中,因此文件系統所能容納的文件數目是由NameNode的內存大小來決定。通常來講,每個文件件夾和Block須要佔據150字節左右的空間,因此,若是你有100萬個文件,每個佔據一個Block,你就至少須要300M內存。當前來講,數百萬的文件仍是可行的,當擴展到數十億時,對於當前的硬件水平來講就沒辦法實現了。還有一個問題就是,由於Map task的數據是由splits來決定的,因此用MR處理大量的小文件時,就會產生過多的Maptask,線程管理開銷將會增長做業時間。舉個例子,處理10000M的文件,若每一個split爲1M,那就會有10000個Maptasks,會有很大的線程開銷;若每一個split爲100M,則只有100個Maptasks,每一個Maptask將會有更多的事情作,而線程的管理開銷也將減小不少。

  改進策略要想讓HDFS能處理好小文件,有很多方法。

  • 利用SequenceFile、MapFile、Har等方式歸檔小文件,這個方法的原理就是把小文件歸檔起來管理,HBase就是基於此的。對於這種方法,若是想找回原來的小文件的內容,那就必須得知道與歸檔文件的映射關係;
  • 橫向擴展,一個Hadoop集羣能管理的小文件有限,那就把幾個Hadoop集羣拖在一個虛擬服務器後面,造成一個大的Hadoop集羣。google也是這麼幹過的。
  • 多Master設計,這個做用顯而易見了。正在研發中的GFS II也要改成分佈式多Master設計,還支持Master的Failover,並且Block大小改成1M,有意要調優處理小文件啊;
  • 附帶個Alibaba DFS的設計,也是多Master設計,它把Metadata的映射存儲和管理分開了,由多個Metadata存儲節點和一個查詢Master節點組成; 

  3)不支持多用戶寫入及任意修改文件

  在HDFS的一個文件中只有一個寫入者,並且寫操做只能在文件末尾完成,即只能執行追加操做。目前HDFS還不支持多個用戶同一個文件操做,以及在文件任意位置進行修改。

 

五、HDFS經常使用操做                                                  

  先說一下「hadoop fs」和「hadoop dfs」的區別,看兩本Hadoop書上各有用到,但效果同樣,求證與網絡發現下面一解釋比較中肯。
  粗略的講,fs是個比較抽象的層面,在分佈式環境中,fs就是dfs,但在本地環境中,fs是local file system,這個時候dfs就不能用。

5.1 文件操做

  1)列出HDFS文件

  

  2)列出HDFS目錄下某個文檔中的文件

   

  3)上傳文件到HDFS

  

  4)將HDFS中文件複製到本地系統中

  

  5)刪除HDFS下的文檔

  

  6)查看HDFS下某個文件

  

  「hadoop fs」的命令遠遠不止這些,本小節的命令能夠再HDFS上完成大多數常規操做。對於其餘操做,能夠經過「-help commandName」命令所列出的清單來進一步學習與探索。 

5.2 管理與更新

  1)報告HDFS的基本統計狀況

  此處爲你展現經過「-report」命令如何查看HDFS的基本統計信息:

     

  執行結果以下所示。

  

  2)退出安全模式

  NameNode在啓動時自動進入安全模式。安全模式是NameNode的一種狀態,在這個階段,文件系統不容許有任何修改。安全模式的目的是在系統啓動時檢查各個DataNode上數據塊的有效性,同時根據策略對數據塊進行必要的複製或刪除,當數據塊最小百分比數知足的最小副本數條件時,會自動退出安全模式。

  系統顯示「Name node is in safe mode」,說明系統正處於安全模式,這時只須要等待17秒便可,也能夠經過下面的命令退出安全模式。

  

   成功退出安全模式的結果以下所示。

  

  3)進入安全模式

  在必要的狀況下,能夠經過如下命令把HDFS置於安全模式。

  

  執行結果以下所示。

  

  4)添加節點

  可擴展性是HDFS的一個重要特性,向HDFS集羣中添加節點是很容易實現的。添加一個新的DataNode節點,首先在新加節點上安裝好Hadoop,要和NameNode使用相同的配置(能夠直接從NameNode複製),修改"/usr/hadoop/conf/master"文件,加入NameNode主機名。而後在NameNode節點上修改"/usr/hadoop/conf/slaves"文件,加入新節點主機名,再創建到新加點無密碼的SSH鏈接,運行啓動命令:

  

  5)負載均衡

  HDFS的數據在各個DataNode中的分佈確定很不均勻,尤爲是DataNode節點出現故障或者新增DataNode節點時。新增數據塊NameNode對DataNode節點的選擇策略也有可能致使數據塊分佈的不均勻。用戶可使用命令從新平衡DataNode的數據塊的分佈:

  

  執行命令前,DataNode節點上數據分佈狀況,以下所示。

  

  

  負載均衡完畢後,DataNode節點上數據的分佈狀況,以下所示。

  

  執行負載均衡命令,以下所示。

  

 

 

    

  感謝原做者,連接:http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html

相關文章
相關標籤/搜索