1. 程式人生 > 實用技巧 >hadoop 元件 hdfs架構及讀寫流程

hadoop 元件 hdfs架構及讀寫流程

hadoop 元件 hdfs架構及讀寫流程

. Namenode

Namenode 是整個系統的管理節點 就像一本書的目錄,儲存檔案資訊,地址,接受使用者請求,等

. Datanode

提供真實的檔案資料,儲存服務

檔案塊(block)是基礎的最基本的儲存單元

2.1塊儲存原理

hdfs為什麼分塊而不是分檔案

大小不一

io不均衡:負載不均衡

一般預設為64或者128M

多副本 預設為三個

Client 端,同一機架一個,另一機架一個

. 讀寫原理

有一個檔案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;傳送過程是以流式寫入。

流式寫入過程,

1>64M的block1按64k的package劃分;

2>然後將第一個package傳送給host2;

3>host2接收完後,將第一個package傳送給host1,同時client想host2傳送第二個package;

4>host1接收完第一個package後,傳送給host3,同時接收host2發來的第二個package。

5>以此類推,如圖紅線實線所示,直到將block1傳送完畢。

6>host2,host1,host3向NameNode,host2向Client傳送通知,說“訊息傳送完了”。如圖粉紅顏色實線所示。

7>client收到host2發來的訊息後,向namenode傳送訊息,說我寫完了。這樣就真完成了。如圖黃色粗實線

8>傳送完block1後,再向host7,host8,host4傳送block2,如圖藍色實線所示。

9>傳送完block2後,host7,host8,host4向NameNode,host7向Client傳送通知,如圖淺綠色實線所示。

10>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。那麼讀取的時候,遵循的規律是:

優選讀取本機架上的資料

posted @ 2017-07-31 10:43 菜鳥的進擊 閱讀(...) 評論(...) 編輯 收藏