分佈式文件系統由計算機集羣中的多個節點構成,這些節點分爲兩類:html
主節點(MasterNode)或者名稱節點(NameNode)node
從節點(Slave Node)或者數據節點(DataNode)shell
兼容廉價的硬件設備數據庫
流數據讀寫編程
大數據集安全
簡單的文件模型服務器
強大的跨平臺兼容性網絡
不適合低延遲數據訪問數據結構
沒法高效存儲大量小文件tcp
不支持多用戶寫入節任意修改文件
HDFS默認一個塊64MB,一個文件被分紅多個塊,以塊爲存儲單位,2.x新版本中是128MB
塊的大小遠大於普通文件系統,能夠最小化尋找開銷
HDFS採用抽象的塊概念能夠帶來一下幾個明顯的好處:
支持大規模文件存儲:文件以塊爲單位進行存儲,一個大規模文件能夠被分拆成若干各文件塊,不一樣文件塊被分發到不一樣節點,所以,一個文件的大小不會受到單個節點存儲容量限制,能夠遠大於網絡中任意節點的存儲容量
簡化系統設計:簡化了存儲管理,由於文件塊大小固定,這樣能夠很是容易算出一個幾點能夠存儲多少塊,其次方便了元數據的管理,元數不須要和文件塊一塊兒存儲,能夠由其餘系統負載管理元數據
適合數據備份:每一個文件塊均可以冗餘存儲到多個節點上,提升了系統容錯和可用性
名稱節點負責管理分佈式文件系統的命令空間(Namespace),保存了兩個核心的數據結構,即Fslmage和EditLog
Fslmage用於維護文件系統樹以及文件樹中全部的文件和文件夾的元數據
操做日誌文件EditLog中記錄了全部針對文件的建立、刪除、重命名等操做
名稱節點記錄了每一個文件中個板塊所在的數據節點的位置信息
Fslmage文件包含文件系統中全部目錄和文件inode的序列化形式,每一個inode是一個文件或目錄的元數據內部表示,幷包含此類信息:文件的複製等級、修改和訪問時間、訪問權限、塊大小以及組成文件的塊。對於目錄,則存儲修改時間、權限和配額元數據
Fslmage文件沒有記錄塊存儲在哪一個數據節點。而是由名稱節點把這些映射保留在內存中,當數據節點加入HDFS集羣時,數據節點會把本身所包含的塊列表告知給名稱節點,此後會按期執行這種告知操做,以確保名稱節點的塊映射時最新的
1)啓動名稱節點---》將FsImage文件---》加載到內存---》執行EditLog---》同步---》內存中的元數據客戶可讀
2)內存與元數據映射完成---》建立新的Fslmage文件+空的Editlog文件
說明:名稱節點起來後,HDFS中的更新操做會從新寫到Editlog文件中,由於Fslmage文件通常都很大(GB級別的很常見),若是全部的更新操做都往Fslmage文件中添加,這樣會致使系統運行的十分緩慢,可是,若是往EditLog文件裏面寫就不會這樣,由於EditLog要小不少,每次執行寫操做以後,且在向客戶端發送成功代碼以前,edits文件都須要同步更新
運行期間HDFS的全部操做---》寫到EditLog---》時間(長此以往)---》EditLog文件將變得很是大
對運行中HDFS影響不大,可是一旦重啓Fslmage裏面的全部內容映像到內存中,而後在一條一條執行EditLog,當EditLog文件很是大的時,就會致使名稱節點啓動很是緩慢,而且此期間是安全模式,沒法提供寫操做,影響用戶使用
解決此問題就須要SecondaryNameNode第二名稱節點
1)它用來保存名稱節點中對HDFS元數據信息的備份,並減去名稱節點重啓的時間,通常是單獨運行在一臺機器上
2)SecondaryNameNode工做狀況
一、SecondaryNameNode按期於NameNode通訊,請求中止使用EditLog文件,暫時將新的寫操做寫到要給新的文件edit.new,此操做瞬間完成,上層寫日誌函數感受不到差異
二、SecondaryNameNode經過HTTP GEt從NameNode上獲取FsImage/EditLog文件下載到本地的相應目錄下
三、SecondaryNameNode將下載的Fslmage載入內存而後一條條執行EditLog中的操做,使得內存中的Fslmage保持最新,這個就是EditLog和FsImage文件合併
四、SecondaryNameNode執行完合併會經過post方式將新的FsImage文件發送到NameNode節點
五、NameNode將從SecondaryNameNode接收到的新的FsImage替換就的FsImage文件,同時將edit.new替換EditLog文件,這時EditLog就變小了
數據分佈在各節點,數據節點負責數據的存儲和讀取,會根據客戶端或名稱節點的調度進行數據的存儲和檢索,而且向名稱節點按期發送所存儲的塊的列表
HDFS採用了主從(M/S)結構模型,名稱節點做爲中心服務器,管理文件系統的命名空間即客戶端文件的訪問。數據節點負責進行客戶端的讀/寫請求,在名稱節點的調度嚇進行數據的建立、刪除、複製操做
HDFS的命名空間包含目錄、文件、塊
HDFS使用傳統的分級文件體系,所以,能夠像使用普通文件系統同樣,建立/刪除目錄和文件,及在目錄間轉移重命名等
HDFS通訊協議都是構建在TCP/IP協議基礎之上
客戶端經過一個可配置端口向名稱節點發起tcp連接,並使用客戶端協議與名稱節點進行交互
名稱節點和數據節點間使用數據節點協議進行交互
客戶端與數據節點的交互是經過RPC(Remote Procedure Call)來實現的。在設計上,名稱節點不會主動發起RPC,而是響應來自客戶端和數據節點的RPC請求
客戶端就是用戶操做HDFS的方式,HDFS在部署時都提供了客戶端
HDFS客戶端時一個庫,包括HDFS文件系接口,這些接口隱藏了HDFS實現中的大部分複雜性
嚴格來講客戶端並非HDFS的一部分
客戶端支持打開、讀寫、寫入等常見的操做,而且提供了相似shell的命令行方式來訪問HDFS中的數據
HDFS也提供了Java API,做爲應用程序訪問文件系統的客戶端編程接口
HDFS只設置了一個名稱節點,這樣作的好處時簡化系統設計,可是也帶了侷限性:
1)命名空間的限制:名稱節點時保持在內存中,所以名稱節點可以容納對象(文件、塊)的個數會收到內存大小限制
2)性能瓶頸:整個分佈式文件系統的吞吐量,受限單個名稱節點的吞吐量
3)隔離問題:因爲集羣中只有一個名稱節點,只有一個命名空間,所以,沒法對不一樣應用程序進行隔離
4)集羣的可用性:一旦惟一的名稱節點發送故障,整個集羣不可用
HDFS採用了多副本方式對數據進行冗餘,多副本方式優勢:
1)加快數據傳輸速度
2)容易檢查數據錯誤
3)保證數據可靠性
1)數據存放
第一個副本:放在上傳文件的數據節點,若是集羣外提交,隨機選一臺磁盤不太滿、cpu不太忙的節點
第二個副本:放置在與第一個副本不一樣的機架的節點上
第三個副本:與第一個副本相同機架的其餘節點上
更多副本:隨機
hdfs提供了一個API能夠肯定一個數據節點所屬的機架ID,客戶端也能夠調用API獲取本身所屬機架ID
當客戶端讀取數據時,名稱節點得到數據塊不一樣的位置列表,列表中包含了副本所在數據節點,發現某個數據數據庫副本對應的機架ID和客戶端對應機架ID相同,就優先選擇該副本讀取數據,如沒有就隨機讀取
HDFS具備較高的容錯性,能夠兼容廉價硬件,它把依你高見出錯看做一種常態,還有機制檢測數據錯誤和自動恢復,容錯性主要由名稱節點出錯、數據節點出錯、數據出錯。
1)名稱節點出錯
回顧:Fslmage,Editlog
若是整個兩個文件損壞,那麼HDFS實例將失效
hdfs提供SecondaryNameNode,將會備份這兩個文件,在必要的時候Fslmage,Editlog數據進行恢復
2)數據節點出錯
心跳信息按期向名稱節點報告本身狀態,若是出問題,就會被標記爲宕機,節點上的數據被標記不可讀,名稱節點將不會給他們發送任何I/O請求
如出現問題,一些數據節點不可用可能會致使一些數據庫副本數量小於冗餘因子,名稱節點會按期進行檢測,一旦發生這種狀況會啓動數據冗餘複製,爲它生成新的副本
HDFS和其餘分佈式文件系統最大的區別就是能夠調整冗餘數據位置
3)數據出錯
由網絡磁盤等錯誤的因素都會致使數據錯誤,客戶端讀取到數據後都會進行md5/sha1對數據進行校驗,以肯定讀取到正確的數據
在建立文件時,客戶端會對每一個文件進行信息摘錄,並把這些信息寫入到一個路徑的隱藏文件
客戶端讀取文件時,先讀取信息摘錄,而後利用該信息進行校驗,若是出錯,客戶端就會請求到另外的節點讀取,並向名稱節點報告,名稱節點會按期檢測而且從新複製
簡單流程就是:打開文件--》獲取數據塊信息--》讀取請求--》讀取數據--》獲取數據塊信息--》讀取數據--》關閉文件
簡單流程:建立文件--》建立文件元數據--》寫入數據--》--》寫入數據包--》接收確認包--》關閉文件--》寫操做完成
徹底參考學習:http://dblab.xmu.edu.cn/blog/290-2/