hadoop 原始碼分析HDFS架構演進

mcxiaoracle發表於2022-09-20
  1. HDFS 如何實現有狀態的高可用架構
  1. HDFS 如何解決單機記憶體受限問題
  1. HDFS 支援億級流量的密碼
  1. SecondaryNameNode 作用

1.1 HDFS 架構演進之路

Hadoop 大版本有三個,Hadoop1、hadoop2、Hadoop3,對應的HDFS 也有三個版本 HDFS1、HDFS2、HDFS3,本文會介紹 三個版本之間的架構區別


Namenode 主要是接收客戶端的請求和負責後設資料管理,而 Datanode 主要就是負責儲存資料。Datanode 中儲存的資料都是一個個的塊,每個塊大小預設 64M


具體使用一個客戶端上傳資料的示例來說明:

  1. HDFS 會把使用者上傳的檔案切分成很多個 block,預設 每個 block 大小是64M,
  2. 然後把這些 block 儲存在不同的 datanode 上,並且為每個 block 生成 3 個副3.

  3. 而每個 block 存在哪個 datanode上以及哪些 block 屬於一個檔案這些資訊都儲存在 Namanode 上,這些資料就是後設資料

  4. Namanode 為了快速響應使用者的請求,還會把這些後設資料放到記憶體中。




1.3 HDFS2 架構-實現有狀態的高可用架構

雖然 HDFS1 解決了分散式儲存的問題,但是他的設計還是有一些缺陷,比如:

  1. 單點問題:因為 HDFS1 中只有一個 Namenode ,而所有的後設資料資訊都儲存在 Namenode 上,而一旦 Namenode 出現問題,所有的後設資料就會丟失,而整個叢集也就無法使用了

  1. 記憶體受限問題:Namenode 為了快速響應使用者的請求,會把所有後設資料資訊放到記憶體中,隨著時間的推移,後設資料資訊增多,必然會撐爆記憶體
基於這個兩個問題,HDFS2 誕生了,HDFS2 使用  HA  解決單點問題,使用  聯邦  解決記憶體受限問題。



3.1 HDFS 支援的億級流量具體什麼?


這裡所屬的 支援億級流量 具體是指客戶端的請求,因為 Namenode 管理後設資料,所有任務在執行的時候都要請求 Namenode 的後設資料,而一旦任務多了這個請求量還是很可觀的。



所以 Namenode 必須可以應對 億級 的後設資料請求,為了應對這麼大流量的訪問所以 Namenode 才把所有的後設資料資訊都放到記憶體中了。

但是又為了資料安全,Namenode 又會把 後設資料資訊放到磁碟上,且為了 HA 後設資料還得寫到 JournalNode 叢集中。




那問題就來了,如果後設資料只記憶體中,當然能夠支援億級的請求,但是又要寫磁碟,又要寫 JournalNod ,Namenode 如何解決的呢?其實 Namenode 在管理後設資料的時候,使用了兩個方法來解決此問題:

那就是 雙緩衝分端加鎖



Namenode 在接收客戶端的後設資料操作請求時,是先把資料寫入 記憶體1中,當 記憶體1中的資料寫到一定程度的時候,把 記憶體1記憶體2交換(這裡是指標交換,不是記憶體的copy),然後把交換後的記憶體重新整理到磁碟或者Journalnode中。




3.3 分段加鎖

在 Namenode 後設資料管理這塊,HDFS 使用了多執行緒去實現的,很多地方加了使用 synchronized 加了鎖,但是它並沒有對所有程式碼加鎖,而是隻對有執行緒安全問題的地方加鎖。






推薦閱讀:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69949806/viewspace-2915340/,如需轉載,請註明出處,否則將追究法律責任。

相關文章