1. 程式人生 > >快速瞭解HDFS、NameNode和DataNode

快速瞭解HDFS、NameNode和DataNode

概覽

HDFS特點:

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

② 執行在廉價的機器上。

③ 適合大資料的處理。因為小檔案也佔用一個塊,小檔案越多(1000個1k檔案)塊越 多,NameNode壓力越大。

如:將一個大檔案分成三塊A、B、C的儲存方式

PS:資料複製原則:

除了最後一個塊之外的檔案中的所有塊都是相同的大小。

HDFS的放置策略:

是將一個副本放在本地機架中的一個節點上,另一個位於不同(遠端)機架中的節點上,而最後一個位於不同節點上遠端機架。

涉及到的屬性:

塊大小:Hadoop1版本里預設為64M,Hadoop2版本里預設為128M

複製因子:每個檔案加上其檔案副本的份數

HDFS的基本結構

 

如上圖所示,HDFS基本結構分NameNode、SecondaryNameNode、DataNode這幾個。

NameNode:是Master節點,有點類似Linux裡的根目錄。管理資料塊對映;處理客戶端的讀寫請求;配置副本策略;管理HDFS的名稱空間;

SecondaryNameNode:儲存著NameNode的部分資訊(不是全部資訊NameNode宕掉之後恢復資料用),是NameNode的冷備份;合併fsimage和edits然後再發給namenode。(防止edits過大的一種解決方案)

DataNode

:負責儲存client發來的資料塊block;執行資料塊的讀寫操作。是NameNode的小弟。

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

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

fsimage:元資料映象檔案(檔案系統的目錄樹。)

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

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

NameNode詳解

作用:

Namenode起一個統領的作用,使用者通過namenode來實現對其他資料的訪問和操作,類似於root根目錄的感覺。

Namenode包含:目錄與資料塊之間的關係(靠fsimage和edits來實現),資料塊和節點之間的關係

fsimage檔案與edits檔案是Namenode結點上的核心檔案。

Namenode中僅僅儲存目錄樹資訊,而關於BLOCK的位置資訊則是從各個Datanode上傳到Namenode上的。

Namenode的目錄樹資訊就是物理的儲存在fsimage這個檔案中的,當Namenode啟動的時候會首先讀取fsimage這個檔案,將目錄樹資訊裝載到記憶體中。

而edits儲存的是日誌資訊,在Namenode啟動後所有對目錄結構的增加,刪除,修改等操作都會記錄到edits檔案中,並不會同步的記錄在fsimage中。

而當Namenode結點關閉的時候,也不會將fsimage與edits檔案進行合併,這個合併的過程實際上是發生在Namenode啟動的過程中。

也就是說,當Namenode啟動的時候,首先裝載fsimage檔案,然後在應用edits檔案,最後還會將最新的目錄樹資訊更新到新的fsimage檔案中,然後啟用新的edits檔案。

整個流程是沒有問題的,但是有個小瑕疵,就是如果Namenode在啟動後發生的改變過多,會導致edits檔案變得非常大,大得程度與Namenode的更新頻率有關係。

那麼在下一次Namenode啟動的過程中,讀取了fsimage檔案後,會應用這個無比大的edits檔案,導致啟動時間變長,並且不可控,可能需要啟動幾個小時也說不定。

Namenode的edits檔案過大的問題,也就是SecondeNamenode要解決的主要問題。

SecondNamenode會按照一定規則被喚醒,然後進行fsimage檔案與edits檔案的合併,防止edits檔案過大,導致Namenode啟動時間過長。

DataNode詳解

DataNode在HDFS中真正儲存資料。

首先解釋塊(block)的概念:

  1. DataNode在儲存資料的時候是按照block為單位讀寫資料的。block是hdfs讀寫資料的基本單位。
  2. 假設檔案大小是100GB,從位元組位置0開始,每128MB位元組劃分為一個block,依此類推,可以劃分出很多的block。每個block就是128MB大小。
  3. block本質上是一個 邏輯概念,意味著block裡面不會真正的儲存資料,只是劃分檔案的。
  4. block裡也會存副本,副本優點是安全,缺點是佔空間

SecondaryNode

執行過程:從NameNode上 下載元資料資訊(fsimage,edits),然後把二者合併,生成新的fsimage,在本地儲存,並將其推送到NameNode,同時重置NameNode的edits.

工作原理(轉自“大牛筆記”的部落格,由於實現是清晰,受益很大,在此不做改動)

寫操作:

 

有一個檔案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。那麼讀取的時候,遵循的規律是:

優選讀取本機架上的資料

運算和儲存在同一個伺服器中,每一個伺服器都可以是本地伺服器

補充

元資料

元資料被定義為:描述資料的資料,對資料及資訊資源的描述性資訊。(類似於Linux中的i節點)

以 “blk_”開頭的檔案就是 儲存資料的block。這裡的命名是有規律的,除了block檔案外,還有後 綴是“meta”的檔案 ,這是block的源資料檔案,存放一些元資料資訊。

資料複製

NameNode做出關於塊複製的所有決定。它週期性地從叢集中的每個DataNode接收到一個心跳和一個阻塞報告。收到心跳意味著DataNode正常執行。Blockreport包含DataNode上所有塊的列表。