Hdfs架構,文件寫流程

僞分佈式的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,我們寫完了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章