HDFS存儲系統

  

HDFS存儲系統

1、基本概念

一、NameNodehtml

  HDFS採用Master/Slave架構。namenode就是HDFS的Master架構。主要負責HDFS文件系統的管理工做,具體包括:名稱空間(namespace)管理(如打開、關閉、重命名文件和目錄、映射關係)、文件block管理。NameNode提供的是始終被動接收服務的server。一個文件被分紅一個或多個Bolck,這些Block存儲在DataNode集合裏,NameNode就負責管理文件Block的全部元數據信息。node

  Secondary NameNode主要是定時對NameNode的數據snapshots進行備份,這樣可儘可能下降NameNode崩潰以後致使數據丟失的風險。具體就是從namenode中得到fsimage和edits後把二者從新合併發給NameNode,這樣,既能減輕NameNode的負擔又能安全得備份,一旦HDFS的Master架構失效,就能夠藉助Secondary NameNode進行數據恢復。linux

  namenode管理着全部全部文件系統的元數據。這些元數據包括名稱空間、訪問控制信息、文件和Block的映射信息,以及當前Block的位置信息。還管理着系統範圍內的活動。正則表達式

二、DataNodeshell

  用於存儲並管理元數據。DataNode上存儲了數據塊ID和數據塊內容,以及他們的映射關係。安全

三、客戶端服務器

  訪問HDFS的程序或HDFS shell命令均可以稱爲HDFS的客戶端,在HDFS的客戶端中至少須要指定HDFS集羣配置中的NameNode地址以及端口號信息,或者經過配置HDFS的core-site.xml配置文件來指定。網絡

2、HDFS的組成和架構

2.1 hdfs架構設計

  HDFS最重要的兩個組件爲:做爲Master的NameNode和做爲Slave的DataNode。NameNode負責管理文件系統的命名空間和客戶端對文件的訪問;DataNode是數據存儲節點,全部的這些機器一般都是普通的運行linux的機器,運行着用戶級別的服務進程。架構

 

圖展現了HDFS的NameNode、DataNode以及客戶端的存取訪問關係。NameNode負責保存和管理全部的HDFS元數據,於是用戶數據不須要經過namenode,也就是說文件數據的讀寫是直接在datanode上進行的。HDFS存儲的文件被分割成固定大小的Block,在建立Block的時候,namenode服務器會給每一個block分配一個惟一不變的block標識。datanode服務器把block以linux文件的造成保存在本地磁盤上,而且根據指定的block標識和字節範圍來讀寫塊數據。處於可靠性的考慮,每一個塊都會複製到多個datanode上。默認使用三個冗餘備份。併發

HDFS客戶端代碼以庫的形式被連接到客戶程序中。客戶端和namenode交互只獲取元數據,全部的數據操做都是由客戶端直接和datanode進行交互。

2.2 HDFS讀文件數據流

圖爲HDFS讀文件數據流的過程,具體的執行過程爲:

  一、調用FileSystem的open()打開文件,見序號1:open

  二、DistributedFileSystem使用RPC調用NameNode,獲得文件的數據塊元數據信息,並返回FSDataInputStream給客戶端,見序號2:get block locations

  三、HDFS客戶端調用stream的read()函數開始讀取數據,見序號3:read

  四、調用FSDATAInputStream直接從DataNode獲取文件數據塊,見序號四、5:read

  五、讀完文件時,調用FSDATAInputStream的close函數,見序號6:close

2.3 HDFS寫文件數據流

讀文件時在多個數據塊文件中選擇一個就能夠了,可是寫數據文件時須要同時寫道多個數據塊文件中。

圖爲HDFS寫文件數據流的過程,首先客戶端調用create()來建立文件,而後DistributedFileSystem一樣使用RPC調用namenode首先肯定文件是否不存在,以及客戶端有建立文件的權限,而後建立文件。DistributedFileSystem返回DFSOutputStream,客戶端用於寫數據。客戶端開始寫入數據,DFSOutputStream將數據分紅塊,寫入data queue。data queue由data streamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。分配的數據節點放在pipeline裏。data streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點,第二個數據節點將數據發送給第三個數據節點。DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。

3、HDFS文件結構

一、namenode的存儲目錄中包含三個文件:

  edits、fsimage、fstime。都是二進制文件,能夠經過Hadoop Writable對象就行序列化。

二、編輯日誌(edit log)和文件系統映像(filesystem image)

  當客戶端執行寫操做時,首先namenode會在編輯日誌中寫下記錄,並在內存中保存一個文件系統元數據,而且不斷更新。

  fsimage文件是文件系統元數據的持久性檢查點,和編輯日誌不一樣,它不會再每一個文件系統的寫操做後進行更新。可是文件系統會出現編輯日誌的不斷增加狀況。爲了解決這個問題,引入了secondary namenode。它的任務就是爲原namenode內存中的文件系統元數據產生檢查點,是一個輔助namenode處理fsimage和編輯日誌的節點,它從namenode中拷貝fsimage和編輯日誌到臨時目錄並按期合併成一個新的fsimage,隨後上傳至namenode。具體的檢查點的處理過程以下:

 

  一、secondary namenode首先請求原namenode進行edits的滾動,這樣新的編輯操做就能進入一個新的文件中。

  二、secondary namenode經過http方式讀取原namenode中的fsimage及edits。

  三、secondary namenode讀取fsimage到內存中,而後執行edits中的每一個操做,並建立一個新的統一的fsimage文件。

  四、secondary namenode將新的fsimage發送到原namenode。

  五、原namenode用新的fsimage替換舊的,舊的edits文件用步驟1中的edits進行替換,同時系統會更新fsimage文件到文件的記錄檢查點時間。

4、HDFS核心設計

一、block的大小

block的大小是HDFS關鍵的設計參數之一,默認大小爲64MB,選擇較大的Block的優勢:

  一、減小了客戶端和NameNode通訊的需求。

  二、客戶端可以對一個塊進行屢次操做,這樣就能夠經過block服務器較長時間的TCP鏈接來減小網絡負載。

  三、減小namenode節點須要保存的元數據的數量,從而很容易把全部元數據放在內存中。

固然選擇較大的block也有必定的缺點,當文件太小時,數百個客戶端併發請求訪問會致使系統局部過載,解決這個問題能夠經過自定義更大的HDFS的複製因子來解決。

二、數據複製

  HDFS中,每一個文件存儲成block序列,除了最後一個block,全部的block都是一樣大小,文件的全部block爲了容錯都會被冗餘複製存儲。HDFS中的文件是writer-one,嚴格要求任什麼時候候只能是一個writer。文件的複製會全權交給namenode進行管理,namenode週期性的從集羣中的每一個datanode接收心跳包和一個blockreport。心跳包表示該datanode節點正常工做,而blockreport包括了該datanode上全部的block組成的列表。

三、數據副本存放策略

  副本的存放是HDFS可靠性和高性能的關鍵。HDFS採用一種機架感知的策略來改進數據的可靠性、可用性和網絡帶寬的利用率。一個簡單的沒有優化的策略就是將副本存放在不一樣的機架上。這樣能夠有效防止當整個機架失效時數據的丟失,而且容許讀取數據的時候充分利用多個機架的帶寬。

  HDFS的默認副本系數爲3,副本存放策略是將第一個副本存放在本地機架的節點上,將第二個副本放在同一個機架的另外一個節點上,將第三個副本放在不一樣的機架的節點上。由於是放在兩個機架上,因此減小了讀取數據時須要的網絡傳輸總帶寬。這樣的策略減小了機架之間的數據傳輸,提升了寫操做的效率,機架的錯誤遠比節點的錯誤要少的多,因此不會影響數據的可靠性和可用性。

四、安全模式

  當系統處於安全模式時,不會接受任何對名稱空間的修改,同時也不會對數據塊進行復制或刪除。namenode啓動以後,自動進入安全模式,namenode從全部的datanode接收心跳信號和塊狀態報告。塊狀態報告包括了某個datanode全部的數據塊列表,每一個數據塊都有一個指定的最小副本數。當namenode檢測確認某個數據塊的副本數目達到這個最小值,該數據塊就認爲是副本安全的。在必定百分比的數據塊被namenode檢測確認是安全的以後(加上30s等待時間),namenode將退出安全模式。

1 bin/hadoop dfsadmin -safemode enter //進入安全模式
2 bin/hadoop dfsadmin -safemode leave //退出安全模式
3 bin/hadoop dfsadmin -safemode get //返回安全模式是否開啓的信息
4 bin/hadoop dfsadmin -safemode wait //等待一直等到安全模式結束

五、負載均衡

  HDFS很容易出現不平衡情況的問題,同時也會引起其餘問題,好比說MapReduce程序沒法很好的利用本地計算機的優點,機器之間沒法到達更好的網絡帶寬使用率、機器磁盤沒法利用等。HDFS提供了一個工具,用於分析數據塊分佈和從新均衡DataNode上的數據分佈。

$HADOOP_HOME/bin/start-balancer.sh -t 10%

這個命令,-t參數後面的是HDFS達到平衡狀態的磁盤使用率誤差值。若是機器與機器之間的使用率誤差小於10%,那麼咱們認爲HDFS集羣就達到了平衡狀態。

  負載均衡程序做爲一個獨立的進程與namenode進行分開執行,HDFS均衡負載處理工程以下:

  一、負載均衡服務Rebalancing Server從namenode中獲取datanode的狀況,具體包括每個datanode磁盤使用狀況,見序號1:get datanode report

  二、Rebalancing Server計算哪些機器須要將數據移動,哪些機器能夠接受移動的數據,以及從datanode中獲取須要移動數據的分佈狀況,見序號2:get partial blockmap

  三、Rebalancing Server計算出來哪一臺機器的block移動到另外一臺機器中去,見序號3:copy a block

  四、須要移動block的機器將數據移動到目標機器上,同時刪除本身機器上的block數據,見序號四、五、6

  五、Rebalancing Server獲取本次數據移動的執行結果,並繼續執行這個過程,一直到沒有數據能夠移動或HDFS集羣已經達到平衡的標準爲止,見序號7

六、升級和回滾機制

  和升級軟件同樣,能夠再集羣上升級hadoop,可能升級成功,也可能失敗,若是失敗了,就用rollback進行回滾;若是過了一段時間,系統運行正常,就能夠finalize正式提交此次升級。相關升級和回滾命令以下:

1 bin/hadoop namenode -update //升級
2 bin/hadoop namenode -rollback //回滾
3 bin/hadoop namenode -finalize //提交
4 bin/hadoop namenode -importCheckpoint //從Checkpoint恢復.用於namenode故障

升級過程:

  一、經過dfsadmin -upgradeProgress status檢查是否已經存在一個備份,若是存在,則刪除。

  二、中止集羣並部署Hadoop的新版本

  三、使用-upgrade選項運行新的版本(bin/start-dfs.sh -upgrade)

若是想退回老版本:

  一、中止集羣並部署hadoop的老版本。

  二、用回滾選項啓動集羣,命令以下:bin/start-dfs.sh -rollback

七、HDFS的缺點

  一、訪問時延:HDFS的設計主要是用於大吞吐量的數據,是以必定的時延爲代價的。

  二、對大量小文件的處理

    大量小文件處理時不免產生大量線程時延。解決辦法:利用SequenceFile、MapFile、Har等方式歸檔小文件。就是把小文件歸檔管理,HBase就是這種原理。橫向擴展。多Master設計。

  三、多用戶寫,任意文件修改

4、HDFS經常使用命令

一、archive

    用於建立一個hadoop歸檔文件,hadoop archive是特殊的檔案格式。一個hadoop archive對應一個文件系統目錄。拓展名是.har。

  1)建立一個archive:使用方法以下:

1 hadoop archive -archiveName NAME -p <parenet path> <src>* <dest>
2 
3 archiveName:指定要建立的檔案的名字
4 p:是否建立路徑中的各級服目錄
5 src:須要歸檔的源目錄,能夠含正則表達式
6 dest:保存檔案文件的目標目錄

 

  例如:須要將目錄/usr/work/dir1和/usr/work/dir2歸檔爲work.har,並保存在目標目錄/data/search下,命令以下:

bin/hadoop archive -archiveName work.har /usr/work/dir1 /usr/work/dir2 /data/search

  2)查看archive文件

1 查看前面建立的archive的歸檔文件work.har,須要得到建立的archive中的文件列表,即
2   hadoop dfs -lsr har:///data/search/work.har
3 查看archive中的file1文件的命令以下:
4    hadoop dfs -cat har:///data/search/work.har/dir1/file1

二、distcp

  用於hadoop集羣之間複製數據。

1 例如:將集羣NN1的數據目錄/data/logs複製到NN2的/data/logs目錄,假設端口均爲9000,則在NN1上執行如下命令:(也能夠將多個源目錄複製到一個目錄中)
2 hadoop distcp hdfs://NN1:9000/data/logs hdfs://NN2:9000/data/logs

三、fsck

  fsck是HDFS文件系統的檢查工具。當用戶發現HDFS上的文件可能受損時,可使用這個命令進行檢查,方法以下:

1 hadoop fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | locations | -racks]]]
2 
3 <path>:檢查的起始目錄
4 -move:移動受損文件到/lost+found
5 -delete:刪除受損文件
6 -openforwrite:打印出寫打開的文件
7 -files:打印出整被檢查的文件
8 -blocks:打印出快信息報告
9 -locations:打印出每一個塊的位置信息

5、HDFS Java API的使用方法

hadoop-1.x運行實例

相關文章
相關標籤/搜索