一、HDFS:hadoop分布式文件存儲系統(tǒng)。
優(yōu)點:
1. 基于多副本存儲,實現(xiàn)高容錯
2. 適合大數(shù)據(jù)離線批處理,移動計算,不移動數(shù)據(jù),將數(shù)據(jù)位置暴露給計算框架,把計算任務調(diào)度到數(shù)據(jù)儲存的相應節(jié)點上。(結(jié)合yarn mr等再理解)
3. 存儲大量 數(shù)據(jù),GB、TB、PB等,構(gòu)建成本低,安全可靠。
缺點:
1. 不適合小文件存儲。會造成大量空間用于存儲namenode,資源浪費,運行過程中,元數(shù)據(jù)信息會加載到內(nèi)存中,如果文件過大,內(nèi)存會溢出。如果有很多小文件,可以通過離線定時任務將小文件進行合并。
2. 不支持隨機修改,只支持追加。
3. 不能并發(fā)寫入,當有一個線程正在寫入時,其他的線程會被阻塞。
二、HDFS架構(gòu)及核心概念:
采用master/slave架構(gòu)進行存儲,namenode為主節(jié)點,存儲元數(shù)據(jù)(文件切分成哪些block,每個block存儲在哪些dataNode節(jié)點上),dataNode為從節(jié)點,用于存儲數(shù)據(jù)。
NameNode(NN):Active NameNode只有一個,作用是:維護元數(shù)據(jù)信息;處理客戶端讀寫請求;管理block副本策略,默認每個block存儲3個副本,可修改。
hdfs Client 與NameNode發(fā)出讀寫請求,NameNode返回dataNode節(jié)點信息,Client與DataNode交互讀取/寫入數(shù)據(jù)。
edits:編輯日志,客戶端對目錄和文件的寫操作首先被記到 edits日志中,如創(chuàng)建/刪除文件等。
?fsimage:文件系統(tǒng)元數(shù)據(jù)檢查點鏡像,保存了文件系統(tǒng)中 所有的目錄個文件信息,如:一個文件下有哪些子目錄,子文件,文件由哪些塊組成等等。
StandBy NameNode(SNN):NN的熱備節(jié)點,同步Active NN的 edits日志,fsimage等信息,Active 故障時快速切換為新的Active。
DataNode:hdfs中的存儲節(jié)點,有多個,且容易擴展,如果增加的DN設備,利用 balance腳本可重新將數(shù)據(jù)塊分布,使每個節(jié)點磁盤利用率達到均衡。
執(zhí)行Client的請求;通過心跳向NameNode匯報自己的運行狀態(tài)和列表信息;在集群啟動時 DataNode 向 NameNode 提供存儲的 Block塊信息?
Block塊:hdfs存儲最小單元,默認128M,默認副本數(shù)3個,若文件最后一個塊小于128,保持實際大小。
架構(gòu)圖見:hdfs_1、hdfs_2
三、HDFS高可用:
基于zk實現(xiàn)高可用,包括
1 主備namenode元數(shù)據(jù)共享:基于QJM(journalNode 奇數(shù)個)共享存儲系統(tǒng)來存儲edits日志信息; 過程:
(1) client發(fā)出向 主NN節(jié)點 發(fā)出讀寫請求,寫本地edits日志,同時寫入QJM edits文件
(2)加載到本地內(nèi)存,更新目錄樹(定期checkpoint,鏡像文件寫入本地fsimage文件)
(3)備NN節(jié)點同步QJM edit信息,更新自己內(nèi)存中的元數(shù)據(jù)/目錄樹(同樣定期checkpoint,鏡像文件寫入本地fsimage文件)
2 主備Namenode切換
一個NN對應一個 ZKFC進程(主備切換控制器),ZKFS包含兩個組件:HeathMonitor 和 ActiveStandbyElector;
HeathMonitor 通過RPC遠程調(diào)用檢查NN的健康狀況。
ActiveStandbyElector控制主備切換,1. 集群啟動時,主備NN都會向ZK創(chuàng)建一個名稱相同的臨時節(jié)點(鎖節(jié)點),創(chuàng)建成功的為主,失敗的為備,且同時監(jiān)控臨時節(jié)點;2. 運行過程中,如果主節(jié)點異常,與zk會話消失,臨時節(jié)點將被刪除,備NN監(jiān)控到后,會嘗試創(chuàng)建新的臨時節(jié)點,創(chuàng)建成功,則變?yōu)橹鳎?.?HeathMonitor 監(jiān)測到NN異常,通知zkfc,zkfc調(diào)用ActiveStandbyElector 組件進行主備選舉,且異常的不再參加選舉。
為防止雙主(腦裂),主備切換過程中有一個fencing隔離機制,1. 備份NN先 SSH 到 主NN,調(diào)用一個方法將 主 變?yōu)?備;2. kill -9 殺掉進程; 3. 調(diào)用事先準備好的腳本,關機。
詳見?hdfs_HA
四、HDFS內(nèi)部存儲機制:
考慮到可靠性和寫入性能(機架間帶寬較低),會在當前節(jié)點存儲一個副本,在另外一個機架上選兩個節(jié)點,分別放倆副本。
五、HDFS文件寫入流程:
1. 客戶端向nameNode發(fā)出寫入請求
2.nameNode進行一系列檢查,目錄是否已存在,當前用戶是否有權(quán)限等
3.nameNode回復一個允許寫入的應答
4.client將文件切分成多個block塊(大小使用默認配置,或者自身配置?若自身有配置,會覆蓋默認配置)
5.向nameNode請求上傳第一個block塊
6.檢查dataNode的一些信息
7.返回上傳的dataNode列表
8.向dataNode請求建立block傳輸?shù)墓艿?/p>
9.以package方式傳輸文件,例如,若有3個dataNode,先傳入datanode1,由datanode1寫入磁盤同時傳給datanode2,datanode2寫入磁盤同時傳給datanode3,dn3存儲完會發(fā)送一個成功的消息給dn2,dn2寫入成功并受到dn3的消息后,發(fā)送一個成功的消息給dn1,同理由dn1返回成功的消息給client;client完成第一個bolock塊的發(fā)送后,繼續(xù)進行第5步,請求上傳第二個block塊,以此類推。
10.上傳成功后,client向namenode發(fā)送 寫入成功的消息
11.namenode 進行commit,寫入完成。
圖見 hdfs_write
六、HDFS文件讀取流程:
1.client向NameNode發(fā)送讀取請求
2.nameNode檢查目錄樹、權(quán)限等信息,將block塊及對應datanode列表信息返回給client,其中,dn會根據(jù)與客戶端的距離,由近及遠排列。
3.client與最近的datanode連接,獲取數(shù)據(jù)
4.將獲取到的block拼裝成完整的文件
圖見 hdfs_read
七、數(shù)據(jù)校驗:
寫入文件時校驗:寫入前會計算一個校驗和,并跟隨block存儲到dn中,最后一個dn寫入完成時,再計算一個校驗和并與之對比,若不同,拋出異常。
讀取時校驗:從dn讀取block塊后,計算一個校驗和,并與block存儲的校驗和進行對比,若不同,通知NameNode DN上block塊損壞,Namenode通過心跳通知DN刪除損壞的block,并在其他節(jié)點增加一個備份,保持block數(shù)目一致。
八、HDFS常用文件操作與管理
多練習。
九、增加、刪除一個Datenode時應如何操作?
增加dataNode:從其他dataNode節(jié)點拷貝一個hadoop安裝包(含配置文件),然后利用腳本單獨啟動該節(jié)點,然后利用 start-balancer.sh -threshold 平衡各個節(jié)點的存儲。
刪除dataNode:將要刪除的dataNode加入NameNode黑名單列表中(hsfd-site.xml中,設置dfs.hosts.excludes,加入要拉黑的主機名/IP ),然后刷新 hdfs dfsadmin -refreshNodes。