【Hadoop學習】HDFS基本原理

afra發表於2017-10-16

HDFS簡介

HDSF

Hadoop Distributed File System, Hadoop分散式檔案系統。

特點

1. 儲存多個副本,且提供容錯機制,副本丟失或當機自動恢復。預設存3份。

2. 執行在廉價的機器上。

3. 適合大資料的處理。HDFS預設會將檔案分割成block,64M為1個block。
   然後將block按鍵值對儲存在HDFS上,並將鍵值對的對映存到記憶體中。如果小檔案太多,那記憶體的負擔會很重。
   (筆記:HDFS不適合小檔案儲存:小檔案多,造成記憶體負擔。)

系統結構

clipboard.png

MasterSlave結構。

分為三個角色:NameNodeSecondaryNameNodeDataNode

NameNode

Master節點,大領導。

1. 管理資料塊對映;

2. 處理客戶端的讀寫請求;

3. 配置副本策略;

4. 管理HDFS的名稱空間。

5. namenode 記憶體中儲存的是 = fsimage + edits。

SecondaryNameNode

小弟,分擔大哥namenode的工作量。

SecondaryNameNode負責定時預設1小時,從namenode上,獲取fsimage和edits來進行合併,然後再傳送給namenode。
減少namenode的工作量。

NameNode的冷備份。 

DataNode

Slave節點,奴隸,幹活的。

1. 儲存client發來的資料塊block;

2. 執行資料塊的讀寫操作。

熱備份

b是a的熱備份,如果a壞掉。那麼b馬上執行代替a的工作。

冷備份

b是a的冷備份,如果a壞掉。那麼b不能馬上代替a工作。但是b上儲存a的一些資訊,減少a壞掉之後的損失。

fsimage

後設資料映象檔案(檔案系統的目錄樹)。(?還是不懂)

edits

後設資料的操作日誌(針對檔案系統做的修改操作記錄)

工作原理

寫操作

寫操作原理圖

clipboard.png

寫操作場景

有一個檔案FileA,100M大小。Client將FileA寫入到HDFS上。

HDFS按預設配置。

HDFS分佈在三個機架上Rack1,Rack2,Rack3。

寫操作流程

  1. Client將FileA按64M分塊。分成兩塊,block1和Block2;
  2. Client向nameNode傳送寫資料請求,如圖藍色虛線①--->。
  3. 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相同的另一個節點上;其他副本隨機挑選。 (?沒明白)
    
  4. 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傳送訊息,說block1寫完了。這樣block1就完成了。如圖黃色粗實線;
    
    8> 傳送完block1後,再向host7,host8,host4傳送block2,如圖藍色實線所示;
    
    9> 傳送完block2後,host7,host8,host4向NameNode傳送通知,host7向Client傳送通知,如圖淺綠色實線所示;
    
    10> client向NameNode傳送訊息,說我寫完了,如圖黃色粗實線。這樣就完畢了。
    

寫操作總結

 1. 寫1T檔案,我們需要3T的儲存,3T的網路流量貸款。

 2. 在執行讀或寫的過程中,NameNode和DataNode通過HeartBeat進行儲存通訊,確定DataNode活著。如果發現DataNode死掉了,就將死掉的DataNode上的資料,放到其他節點去。讀取時,要讀其他節點去。

 3. 掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份。
 

讀操作

讀操作原理圖

clipboard.png

讀操作場景

client要從datanode上,讀取FileA。而FileA由block1和block2組成。

讀操作流程

  1. client向namenode傳送讀請求;
  2. namenode檢視Metadata資訊,返回fileA的block的位置:

    block1:host2,host1,host3
    
    block2:host7,host8,host4
    
  3. block的位置是有先後順序的,先讀block1,再讀block2。而且block1去host2上讀取;然後block2,去host7上讀取。

注:
上面例子中,client位於機架外,那麼如果client位於機架內某個DataNode上,例如,client是host6。那麼讀取的時候,遵循的規律是:優選讀取本機架上的資料

整理自大牛筆記的博文。

相關文章