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