簡介:
HDFS(Hadoop Distributed File System )Hadoop分佈式文件系統。
是根據google發表的論文翻版的。論文爲GFS(Google File System)Google 文件系統。
HDFS有很多特點:
①保存多個副本,且提供容錯機制,副本丟失或宕機自動恢復。默認存3份。
②運行在廉價的機器上
③適合大數據的處理。多大,多小?HDFS默認會將文件分割成block,64M爲一個block。
然後將block按鍵值對存儲在HDFS上並將鍵值對的映射存到內存中(namenode)。
如果小文件太多,那內存的負擔會很重。
如上圖所示,HDFS也是按照Master和Slaver的結構。分NameNode、SecondaryNameNode、
DataNode這幾個角色;
NameNode:是Master節點,是管理者,管理數據塊映射;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名
稱空間:
- NameNode保存的metadata包括:
- 文件ownership和permission
- 文件包含了block信息
- Block保存在那些DataNode節點上(這部分數據並非保存在NameNode磁盤上的,它在DataNode啓動時報告給NameNode的,Name接收到之後將這些信息保存在內存中)
- NameNode的metadata信息在NameNode啓動後加載到內存中
- Metadata存儲到磁盤上的文件名稱爲fsimage
- Block的位置信息不會保存在fsimage中
- Edits文件記錄了客戶端操作fsimage的日誌,對文件的增刪改等。
- 用戶對fsimage的操作不會直接更新到fsimage中去,俄日是記錄在edits中
SecondaryNameNode :分擔namenode的工作量;是NameNode的冷備份;合併fsimage和fsedits然後再發給namenode。
- 合併fsimage和edtis文件,然後發送並替換NameNode的fsimage文件,同時自己留下一個副本。這個副本可提供NameNode毀壞之後的部分文件回覆。
- 可以通過fs.checkpoint.period修改合併時間,默認1小時。
- 也可以通過配置edits日誌文件大小,fs.checkpoint.size規定edits文件的最大值,來讓SecondaryNameNode來知道什麼時候該進行合併操作了。默認是64M
合併過程如下:
DataNode:Slaver節點,奴隸,幹活的。負責存儲client發來的數據塊block;執行數據塊的讀寫操作。
熱備份:b是a的熱備份,如果a壞掉。那麼b馬上運行代替a工作。
冷備份:b是a的冷備份,如果a壞掉。那麼b不能馬上代替a工作。但是b上存儲a的一些信息,減少a壞掉之後的損失。
fsimage:元數據鏡像文件(文件系統的目錄樹。)
edits:元數據的操作日誌(針對文件系統做的修改操作記錄)
namenode內存中存儲的是=fsimage+edits。
ScondaryNameNode負責定時默認1小時,從namenode上,獲取fsimage和edits來進行合併,然後再發送給namenode。減少namenode的工作量e。
HDFS優點:
- 高容錯性
- 數據自動保存多個副本。
- 副本丟失後,自動恢復。
- 適合批量處理
- 移動計算的操作
- 數據位置暴露給計算框架
- 適合大數據處理
- GB、TB、PB甚至更大
- 百萬規模以上的文章數量
- 10k+節點可以建在廉價機器上
- 通過副本提高可靠性
- 提供了容錯和恢復機制
HDFS缺點:
- 低延遲數據訪問
- 毫秒級讀取
- 低延遲與高吞吐量
- 小文件存取
- 佔用NameNode
- 尋址時間超過讀取時間
- 併發寫入,文件隨即修改
- 一個文件同時只能有一個寫入者
- 僅支持append
工作原理:
寫操作:
- 有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。
- HDFS按默認配置。
- HDFS分佈在三個機架上Rack1,Rack2,Rack3。
a. Client將FileA按64M分塊。分成兩塊,block1和Block2;
b. Client向nameNode發送寫數據請求,如圖藍色虛線①------>。
c. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②--------->。
Block1: host2,host1,host3
Block2: host7,host8,host4
原理:
- NameNode具有RackAware機架感知功能,這個可以配置。
- 若client爲DataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。
- 若client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選。
d. client向DataNode發送block1;發送過程是以流式寫入。
流式寫入過程:
- 將64M的block1按64k的package劃分;
- 然後將第一個package發送給host2;
- host2接收完後,將第一個package發送給host1,同時client想host2發送第二個package;
- host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package。
- 以此類推,如圖紅線實線所示,直到將block1發送完畢。
- host2,host1,host3向NameNode,host2向Client發送通知,說“消息發送完了”。如圖粉紅顏色實線所示。
- client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。如圖黃色粗實線。
- 發送完block1後,再向host7,host8,host4發送block2,如圖藍色實線所示。
- 發送完block2後,host7,host8,host4向NameNode,host7向Client發送通知,如圖淺綠色實線所示。
- client向NameNode發送消息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。
分析:
- 通過寫過程,我們可以瞭解到:
- 寫1T文件,我們需要3T的存儲,3T的網絡流量帶寬。
- 在執行讀或寫的過程中,NameNode和DataNode通過HeartBeat進行保存通信,確定DataNode活着。如果發現DataNode死掉了,就將死掉的DataNode上的數據,放到其他節點去。讀取時,要讀其他節點去。
- 掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份。
讀操作:
讀操作就簡單一些了,如圖所示,client要從datanode上,讀取FileA。而FileA由block1和block2組成。
讀操作流程爲:
a. client向namenode發送讀請求。
b. namenode查看Metadata信息,返回fileA的block的位置。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有先後順序的,先讀block1,再讀block2。而且block1去host2上讀取;然後block2,去host7上讀取;
上面例子中,client位於機架外,那麼如果client位於機架內某個DataNode上,例如,client是host6。那麼讀取的時候,遵循的規律是:
優選讀取本機架上的數據。
HDFS文件權限:
- 與Linux文件權限類似
- r:read;w:write;x:execute
- 如果Linux系統用用戶xxx使用hadoop命令創建一個文件,那麼,在hdfs中這個文件的owner就是xxx
- HDFS的權限目的是將控制權交出去,本身只判斷用戶和權限,至於用戶是不是真的,不管。
HDFS安全模式:
- NameNode啓動的時候,首先講fsimage載入內存,然後按照fsedits中的各項操作修改內存中的fsimage。
- 當元數據文件在內存中創建完成之後,在NameNode上創建一個新的fsimage替換原fsimage,同時創建一個空的fsedits文件(無需SecodaryNameNode參與)這時,NameNode是運行在安全模式的。即對外(客戶端)只讀,所以此段時間內對hdfs的寫入、刪除、重命名都會失敗。
- 然後NameNode收集各個DataNode的報告,當block達到最小副本數以上時,會被認爲“安全”的了,在一定比例的數據塊被確定爲“安全”後,再過若干事件後,安全模式結束。
- 當檢測到副本數不足的數據塊時,該塊會被複制,直到達到最小副本數。
- Hdfs中數據塊的位置並不是由namenode維護的,而是以塊列表的形式存儲在datanode中的。
HDFS中常用到的命令:
- hdfs fs:
- hdfs fs -ls /
- hdfs fs -lsr
- hdfs fs -mkdir /user/hadoop
- hdfs fs -put a.txt /user/hadoop/
- hdfs fs -get /user/hadoop/a.txt /
- hdfs fs -cp src dst
- hdfs fs -mv src dst
- hdfs fs -cat /user/hadoop/a.txt
- hdfs fs -rm /user/hadoop/a.txt
- hdfs fs -rmr /user/hadoop/a.txt
- hdfs fs -text /user/hadoop/a.txt
- hdfs fs -copyFromLocal localsrc dst 與 hadoop fs -put 功能類似
- hdfs fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件。
- hdfs dfsadmin
- hdfs dfsasmin -report
- hdfs dfsadmin -safemode enter | leave | get | wait
- hdfs dfsadmin -setBalancerBandwidth 1000
- hdfs fsck
- start-balancer.sh
負載均衡,可以使用DataNote節點上選擇策略重新平衡DataNode上的數據塊的分佈。