1. 程式人生 > >Hdfs架構,檔案寫流程

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,我們寫完了。