HDFS存储系统
HDFS存儲系統
一、基本概念
1、NameNode
HDFS采用Master/Slave架構。namenode就是HDFS的Master架構。主要負責HDFS文件系統的管理工作,具體包括:名稱空間(namespace)管理(如打開、關閉、重命名文件和目錄、映射關系)、文件block管理。NameNode提供的是始終被動接收服務的server。一個文件被分成一個或多個Bolck,這些Block存儲在DataNode集合里,NameNode就負責管理文件Block的所有元數據信息。
Secondary NameNode主要是定時對NameNode的數據snapshots進行備份,這樣可盡量降低NameNode崩潰之后導致數據丟失的風險。具體就是從namenode中獲得fsimage和edits后把兩者重新合并發給NameNode,這樣,既能減輕NameNode的負擔又能安全得備份,一旦HDFS的Master架構失效,就可以借助Secondary NameNode進行數據恢復。
namenode管理著所有所有文件系統的元數據。這些元數據包括名稱空間、訪問控制信息、文件和Block的映射信息,以及當前Block的位置信息。還管理著系統范圍內的活動。
2、DataNode
用于存儲并管理元數據。DataNode上存儲了數據塊ID和數據塊內容,以及他們的映射關系。
3、客戶端
訪問HDFS的程序或HDFS shell命令都可以稱為HDFS的客戶端,在HDFS的客戶端中至少需要指定HDFS集群配置中的NameNode地址以及端口號信息,或者通過配置HDFS的core-site.xml配置文件來指定。
二、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讀文件數據流的過程,具體的執行過程為:
1、調用FileSystem的open()打開文件,見序號1:open
2、DistributedFileSystem使用RPC調用NameNode,得到文件的數據塊元數據信息,并返回FSDataInputStream給客戶端,見序號2:get block locations
3、HDFS客戶端調用stream的read()函數開始讀取數據,見序號3:read
4、調用FSDATAInputStream直接從DataNode獲取文件數據塊,見序號4、5:read
5、讀完文件時,調用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中的數據節點告知數據已經寫入成功。
三、HDFS文件結構
1、namenode的存儲目錄中包含三個文件:
edits、fsimage、fstime。都是二進制文件,可以通過Hadoop Writable對象就行序列化。
2、編輯日志(edit log)和文件系統映像(filesystem image)
當客戶端執行寫操作時,首先namenode會在編輯日志中寫下記錄,并在內存中保存一個文件系統元數據,并且不斷更新。
fsimage文件是文件系統元數據的持久性檢查點,和編輯日志不同,它不會再每個文件系統的寫操作后進行更新。但是文件系統會出現編輯日志的不斷增長情況。為了解決這個問題,引入了secondary namenode。它的任務就是為原namenode內存中的文件系統元數據產生檢查點,是一個輔助namenode處理fsimage和編輯日志的節點,它從namenode中拷貝fsimage和編輯日志到臨時目錄并定期合并成一個新的fsimage,隨后上傳至namenode。具體的檢查點的處理過程如下:
?
1、secondary namenode首先請求原namenode進行edits的滾動,這樣新的編輯操作就能進入一個新的文件中。
2、secondary namenode通過http方式讀取原namenode中的fsimage及edits。
3、secondary namenode讀取fsimage到內存中,然后執行edits中的每個操作,并創建一個新的統一的fsimage文件。
4、secondary namenode將新的fsimage發送到原namenode。
5、原namenode用新的fsimage替換舊的,舊的edits文件用步驟1中的edits進行替換,同時系統會更新fsimage文件到文件的記錄檢查點時間。
四、HDFS核心設計
1、block的大小
block的大小是HDFS關鍵的設計參數之一,默認大小為64MB,選擇較大的Block的優點:
1、減少了客戶端和NameNode通信的需求。
2、客戶端能夠對一個塊進行多次操作,這樣就可以通過block服務器較長時間的TCP連接來減少網絡負載。
3、減少namenode節點需要保存的元數據的數量,從而很容易把所有元數據放在內存中。
當然選擇較大的block也有一定的缺點,當文件過小時,數百個客戶端并發請求訪問會導致系統局部過載,解決這個問題可以通過自定義更大的HDFS的復制因子來解決。
2、數據復制
HDFS中,每個文件存儲成block序列,除了最后一個block,所有的block都是同樣大小,文件的所有block為了容錯都會被冗余復制存儲。HDFS中的文件是writer-one,嚴格要求任何時候只能是一個writer。文件的復制會全權交給namenode進行管理,namenode周期性的從集群中的每個datanode接收心跳包和一個blockreport。心跳包表示該datanode節點正常工作,而blockreport包括了該datanode上所有的block組成的列表。
3、數據副本存放策略
副本的存放是HDFS可靠性和高性能的關鍵。HDFS采用一種機架感知的策略來改進數據的可靠性、可用性和網絡帶寬的利用率。一個簡單的沒有優化的策略就是將副本存放在不同的機架上。這樣可以有效防止當整個機架失效時數據的丟失,并且允許讀取數據的時候充分利用多個機架的帶寬。
HDFS的默認副本系數為3,副本存放策略是將第一個副本存放在本地機架的節點上,將第二個副本放在同一個機架的另一個節點上,將第三個副本放在不同的機架的節點上。因為是放在兩個機架上,所以減少了讀取數據時需要的網絡傳輸總帶寬。這樣的策略減少了機架之間的數據傳輸,提高了寫操作的效率,機架的錯誤遠比節點的錯誤要少的多,所以不會影響數據的可靠性和可用性。
4、安全模式
當系統處于安全模式時,不會接受任何對名稱空間的修改,同時也不會對數據塊進行復制或刪除。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 //等待一直等到安全模式結束5、負載均衡
HDFS很容易出現不平衡狀況的問題,同時也會引發其他問題,比如說MapReduce程序無法很好的利用本地計算機的優勢,機器之間無法到達更好的網絡帶寬使用率、機器磁盤無法利用等。HDFS提供了一個工具,用于分析數據塊分布和重新均衡DataNode上的數據分布。
$HADOOP_HOME/bin/start-balancer.sh -t 10%
這個命令,-t參數后面的是HDFS達到平衡狀態的磁盤使用率偏差值。如果機器與機器之間的使用率偏差小于10%,那么我們認為HDFS集群就達到了平衡狀態。
負載均衡程序作為一個獨立的進程與namenode進行分開執行,HDFS均衡負載處理工程如下:
1、負載均衡服務Rebalancing Server從namenode中獲取datanode的情況,具體包括每一個datanode磁盤使用情況,見序號1:get datanode report
2、Rebalancing Server計算哪些機器需要將數據移動,哪些機器可以接受移動的數據,以及從datanode中獲取需要移動數據的分布情況,見序號2:get partial blockmap
3、Rebalancing Server計算出來哪一臺機器的block移動到另一臺機器中去,見序號3:copy a block
4、需要移動block的機器將數據移動到目標機器上,同時刪除自己機器上的block數據,見序號4、5、6
5、Rebalancing Server獲取本次數據移動的執行結果,并繼續執行這個過程,一直到沒有數據可以移動或HDFS集群已經達到平衡的標準為止,見序號7
6、升級和回滾機制
和升級軟件一樣,可以再集群上升級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故障升級過程:
1、通過dfsadmin -upgradeProgress status檢查是否已經存在一個備份,如果存在,則刪除。
2、停止集群并部署Hadoop的新版本
3、使用-upgrade選項運行新的版本(bin/start-dfs.sh -upgrade)
如果想退回老版本:
1、停止集群并部署hadoop的老版本。
2、用回滾選項啟動集群,命令如下:bin/start-dfs.sh -rollback
7、HDFS的缺點
1、訪問時延:HDFS的設計主要是用于大吞吐量的數據,是以一定的時延為代價的。
2、對大量小文件的處理
大量小文件處理時難免產生大量線程時延。解決辦法:利用SequenceFile、MapFile、Har等方式歸檔小文件。就是把小文件歸檔管理,HBase就是這種原理。橫向擴展。多Master設計。
3、多用戶寫,任意文件修改
四、HDFS常用命令
1、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/search2)查看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/file12、distcp
用于hadoop集群之間復制數據。
1 例如:將集群NN1的數據目錄/data/logs復制到NN2的/data/logs目錄,假設端口均為9000,則在NN1上執行以下命令:(也可以將多個源目錄復制到一個目錄中) 2 hadoop distcp hdfs://NN1:9000/data/logs hdfs://NN2:9000/data/logs3、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:打印出每個塊的位置信息五、HDFS Java API的使用方法
見hadoop-1.x運行實例
?
當神已無能為力,那便是魔渡眾生總結
- 上一篇: 【案例】常驻查询引发的thread po
- 下一篇: python 转 exe -- py2e