僞分佈式的HDFS 的NN,DN,SNN都是部署在同一臺機器上的。
HDFS的啓動:./start-dfs.sh
HDFS查看內容 hdfs dfs -ls
1.block的概念
hdfs默認一個block(塊)是134217728個字節(128M),數據被切分以塊爲單位存儲在不同的機器上,
舉個例子
每個瓶子容量128ML 1碗水260ML 需要3個瓶子
A 128ml
B 128ml
C 4ml
一般來說,生產環境的數據會有3個副本,也就是數據的每一個塊會被複制3份存儲起來,防止某些塊數據丟失。
2.HDFS架構設計,主從結構
NN 主 名稱節點
SNN 第二名稱節點 --》NN(如果掛了)
DN 從 數據節點
(1)namenode
NN的功能是存儲文件目錄結構,文件屬性名稱等,還有文件對應哪些數據塊,數據塊對應分佈到哪些datanode節點上。
需要注意的是,namenode不會持久化存儲這種數據塊的對應關係,,集羣在啓動和運行時會定期發送blockreport給namenode彙報存儲情況,namenode就可以在內存中動態維護這種映射關係。
namenode會將存儲的信息以兩種文件形式去保存。
1.命名空間鏡像文件 fsimage
2.編輯日誌 editlog
(2)datanode
datanode存儲數據塊和塊的校驗和,功能就是文件數據塊的讀寫,塊的校驗和就是當一個完整的數據被切分分開存儲後,使用時從不同存儲地方讀取出來的數據組合起來時,用來檢測數據是否發生了丟失和損壞的。
和NN通信:
1.datanode會每隔3秒發送一個心跳包,通報存活情況
2.每隔10次心跳發送一個blockreport,彙報最新存儲情況
(3)secondary namenode
snn是存儲nn的fsimage和editlog的,他的作用是定期合併fsimage+editlog文件爲新的fsimage,推送給NN,稱爲檢查點,checkpoint
dfs.namenode.checkpoint.period: 3600 相當於1個小時更新一次
fsimage: 鏡像文件 文件系統樹 全量 7:00
editlog:操作日誌 讀寫的操作記錄 增量 7:00-8:00
如下圖所示,假設當前是7.整,nn會把edit和fsimage讀取到snn裏,snn會把這兩個文件整合爲一個新的鏡像文件返回給nn,這時的鏡像文件相當於有了8.前所有的文件情況,edit保持持續更新。
3.副本的放置策略
在生產環境中,機器會被放到機架裏。
之前說過存儲在datanode塊裏的數據會有3個副本。一般來說。
第一個副本:
假設我提交文件的所在機器就是datanode節點,
那麼第一個塊就存儲在本節點上;
如果不是,就隨機挑選一臺磁盤不太慢的 cpu不太繁忙的節點上;(通過心跳判斷)
第二個副本:
放置在於第一個副本的不同的機架的節點上
第三個副本:
與第二個副本相同的機架的不同的節點上
4.hdfs文件的寫流程
linux -> hdfs
假如輸入一個命令: hdfs dfs -put xxx.log /user/hadoop/asd
1.Client(就是輸命令啦)調filesystem.create(path,path就是上面指令後面的路徑),與nn rpc通信,check path是否已經存在及有沒有權限創建;
假如OK,就創建一個新文件,但是不關聯任何的block,返回一個FSDataOutputStream對象;
假如不OK,就返回錯誤信息
2.Client調用FSDataOutputStream對象的write方法,
將第一個塊寫給DN1,當第一個塊寫完,DN1複製塊到DN2,當第二個塊寫完,DN2複製塊到DN3,當第三個塊寫完,DN3返回一個ack packet確認包給DN2,
當DN2收到DN3的ack,發送一個ack給DN1,當DN1收到DN2的ack,發送一個ack給FSDataOutputStream對象,標識第一個塊3個副本全部寫完;
然後餘下的塊依次這麼寫!
3.當文件寫完成,Client調用FSDataOutputStream對象的close方法,關閉輸出流,flush緩存區的數據包;
4.再調用filesystem.complete方法,告訴NN,我們寫完了。