HDFS架構及原理

Algoric發表於2019-03-23

一、HDFS簡介

分散式檔案儲存
隨著資料量的不斷增大,檔案的大小取決於單機儲存的上限,這顯然滿足不了我們的需求。HDFS將大檔案切塊,部署到不同的機器節點上,完成分散式儲存。

HDFS架構及原理

在分散式系統中,計算機節點放在機架上,每個機架存在很多節點,不同機架之間通過交換機通訊,同一機架不同節點之間通過網路互連。

遠端呼叫:遠端過程呼叫(RPC)是一種常用的分散式網路通訊協議,它允許執行於 一臺計算機的程式呼叫另一臺計算機的子程式,同時將網路的通訊細節隱藏起來, 使得使用者無須額外地為這個互動作用程式設計。分散式系統之間的通訊大都通過RPC實現。

二、HDFS結構

HDFS架構及原理
  • 名稱節點(NameNode) 主節點(Master)
  • 資料節點 (DataNode) 從節點(Slave)

名稱節點負責檔案和目錄的建立、刪除和重新命名等,同時管理資料節點與檔案塊的對映關係;資料節點負責資料的儲存和讀取。

客戶端讀資料會先訪問名稱節點,獲取資料塊對應資料節點的位置,進而讀取資料,寫入資料也會由名稱節點分配儲存位置,再向對應資料節點寫入資料。

1. 名稱節點

名稱節點的兩個核心資料結構:

  • FsImage
    FsImage用於維護檔案系統樹以及檔案樹中所有的檔案和資料夾的後設資料
    後設資料資訊包括檔案的複製等級、修改和訪問時間、訪問許可權、塊大小以及組成檔案的塊
    注:FsImage檔案沒有記錄塊儲存在哪個節點,資料塊和節點對映資訊儲存在NameNode的記憶體中。

  • EditLog
    記錄對所有檔案建立、刪除、重新命名等操作。

SecondaryNameNode

HDFS架構及原理
  1. secondDaryNameNode會定期與NameNode通訊,暫停EditLog,建立新的EditNew,瞬間完成 。

  2. FsImage和EditLog會不斷增大,secondDaryNameNode可以解決這個問題,它會定期拉取這兩個檔案,進行一個合併過程,通過執行EditLog檔案,得到最新的FsImage,推送到NameNode, 代替原有的FsImage,同時使用editNew代替原有EditLog檔案。

  3. secondDaryNameNode 還可以作為冷備份,在NameNode當機後使用它進行恢復

2. 資料節點

HdFS按塊儲存,每個塊預設大小是128M,遠遠大於普通檔案系統,這樣做的目的是為了最小化定址開銷。

2.1 檔案系統儲存原理

檔案儲存在磁碟上,磁碟讀取資料靠的是機械運動。

  • 當需要從磁碟讀取資料時,系統會將資料邏輯地址傳給磁碟,磁碟的控制電路按照定址邏輯將邏輯地址翻譯成實體地址,即確定要讀的資料在哪個磁軌,哪個扇區。為了讀取這個扇區的資料,需要將磁頭放到這個扇區上方,
  • 為了實現這一點,磁頭需要移動對準相應磁軌,這個過程叫做尋道,所耗費時間叫做尋道時間,然後磁碟旋轉將目標扇區旋轉到磁頭下,這個過程耗費的時間叫做旋轉時間。
  • 最後是對讀取資料的傳輸。

所以每次讀取資料花費的時間可以分為尋道時間、旋轉延遲、傳輸時間三個部分

HDFS讀取檔案的時間就可以分為定址時間和資料傳輸時間,如果檔案太小,在名稱節點的對映列表會過大,影響定址時間,定址時間如果大於傳輸時間,就沒有意義了。所以設定成大檔案。

如果Block設定過大,在MapReduce任務中,Map或者Reduce任務的個數小於叢集機器數量,會使得作業執行效率很低。

2.2 資料冗餘

HDFS採取多副本進行資料冗餘,一個資料塊預設冗餘三個副本,其中一個副本放到不同機架上,其它兩個副本放在同一個機架不同節點上。

HDFS架構及原理

如圖,資料塊1被分別存放到資料節點A和C上,資料塊2被存放在資料節點A和B上

2.3 資料錯誤

網路傳輸或者磁碟讀寫可能會導致資料錯誤
解決辦法:

  • 在檔案被建立的時候,客戶端對檔案進行摘錄,並寫入資料同一路徑隱藏檔案中。
  • 客戶端讀取資料後會進行資料塊的校驗,一般使用md5或者sha1演算法,如果出錯會請求其它節點的資料塊,並向名稱節點彙報,名稱節點會定期檢查並重新複製這個block.

三、HDFS讀寫過程

寫入:

  1. 提交寫操作到NameNode,判斷是否有許可權。NameNode為其分配資料節點,返回資訊。
  2. 進行資料互動,把資料進行分塊,先寫完第一個副本,拷貝到第二個節點,再到第三個節點,形成“流水線複製”。
  3. 為了保證節點資料準確,接收到資料的資料節點要向傳送者返回ACK確認資訊,確認包會順著流水線逆流而上,經過各個節點到達客戶端。

讀取:
HDFS提供了一個API可以確定一個資料節點所屬的機架ID,客戶端也可以呼叫API獲取自己所屬的機架ID

  1. 客戶端請求NameNode,計算出距離client最近的副本,返回後設資料資訊;
    當客戶端讀取資料時,從名稱節點獲得資料塊不同副本的存放位置列表,列表中包含了副本所在的資料節點,可以呼叫API來確定客戶端和這些資料節點所屬的機架ID,當發現某個資料塊副本對應的機架ID和客戶端對應的機架ID相同時,就優先選擇該副本讀取資料,如果沒有發現,就隨機選擇一個副本讀取資料

  2. 客戶端讀取對應資料塊資訊。

本文參考廈門大學林子雨老師的大資料課程

相關文章