一、HDFS簡介
分散式檔案儲存
隨著資料量的不斷增大,檔案的大小取決於單機儲存的上限,這顯然滿足不了我們的需求。HDFS將大檔案切塊,部署到不同的機器節點上,完成分散式儲存。
在分散式系統中,計算機節點放在機架上,每個機架存在很多節點,不同機架之間通過交換機通訊,同一機架不同節點之間通過網路互連。
遠端呼叫:遠端過程呼叫(RPC)是一種常用的分散式網路通訊協議,它允許執行於 一臺計算機的程式呼叫另一臺計算機的子程式,同時將網路的通訊細節隱藏起來, 使得使用者無須額外地為這個互動作用程式設計。分散式系統之間的通訊大都通過RPC實現。
二、HDFS結構
- 名稱節點(NameNode) 主節點(Master)
- 資料節點 (DataNode) 從節點(Slave)
名稱節點負責檔案和目錄的建立、刪除和重新命名等,同時管理資料節點與檔案塊的對映關係;資料節點負責資料的儲存和讀取。
客戶端讀資料會先訪問名稱節點,獲取資料塊對應資料節點的位置,進而讀取資料,寫入資料也會由名稱節點分配儲存位置,再向對應資料節點寫入資料。
1. 名稱節點
名稱節點的兩個核心資料結構:
-
FsImage
FsImage用於維護檔案系統樹以及檔案樹中所有的檔案和資料夾的後設資料
後設資料資訊包括檔案的複製等級、修改和訪問時間、訪問許可權、塊大小以及組成檔案的塊
注:FsImage檔案沒有記錄塊儲存在哪個節點,資料塊和節點對映資訊儲存在NameNode的記憶體中。 -
EditLog
記錄對所有檔案建立、刪除、重新命名等操作。
SecondaryNameNode
-
secondDaryNameNode會定期與NameNode通訊,暫停EditLog,建立新的EditNew,瞬間完成 。
-
FsImage和EditLog會不斷增大,secondDaryNameNode可以解決這個問題,它會定期拉取這兩個檔案,進行一個合併過程,通過執行EditLog檔案,得到最新的FsImage,推送到NameNode, 代替原有的FsImage,同時使用editNew代替原有EditLog檔案。
-
secondDaryNameNode 還可以作為冷備份,在NameNode當機後使用它進行恢復
2. 資料節點
HdFS按塊儲存,每個塊預設大小是128M,遠遠大於普通檔案系統,這樣做的目的是為了最小化定址開銷。
2.1 檔案系統儲存原理
檔案儲存在磁碟上,磁碟讀取資料靠的是機械運動。
- 當需要從磁碟讀取資料時,系統會將資料邏輯地址傳給磁碟,磁碟的控制電路按照定址邏輯將邏輯地址翻譯成實體地址,即確定要讀的資料在哪個磁軌,哪個扇區。為了讀取這個扇區的資料,需要將磁頭放到這個扇區上方,
- 為了實現這一點,磁頭需要移動對準相應磁軌,這個過程叫做尋道,所耗費時間叫做尋道時間,然後磁碟旋轉將目標扇區旋轉到磁頭下,這個過程耗費的時間叫做旋轉時間。
- 最後是對讀取資料的傳輸。
所以每次讀取資料花費的時間可以分為尋道時間、旋轉延遲、傳輸時間三個部分
HDFS讀取檔案的時間就可以分為定址時間和資料傳輸時間,如果檔案太小,在名稱節點的對映列表會過大,影響定址時間,定址時間如果大於傳輸時間,就沒有意義了。所以設定成大檔案。
如果Block設定過大,在MapReduce任務中,Map或者Reduce任務的個數小於叢集機器數量,會使得作業執行效率很低。
2.2 資料冗餘
HDFS採取多副本進行資料冗餘,一個資料塊預設冗餘三個副本,其中一個副本放到不同機架上,其它兩個副本放在同一個機架不同節點上。
如圖,資料塊1被分別存放到資料節點A和C上,資料塊2被存放在資料節點A和B上
2.3 資料錯誤
網路傳輸或者磁碟讀寫可能會導致資料錯誤
解決辦法:
- 在檔案被建立的時候,客戶端對檔案進行摘錄,並寫入資料同一路徑隱藏檔案中。
- 客戶端讀取資料後會進行資料塊的校驗,一般使用md5或者sha1演算法,如果出錯會請求其它節點的資料塊,並向名稱節點彙報,名稱節點會定期檢查並重新複製這個block.
三、HDFS讀寫過程
寫入:
- 提交寫操作到NameNode,判斷是否有許可權。NameNode為其分配資料節點,返回資訊。
- 進行資料互動,把資料進行分塊,先寫完第一個副本,拷貝到第二個節點,再到第三個節點,形成“流水線複製”。
- 為了保證節點資料準確,接收到資料的資料節點要向傳送者返回ACK確認資訊,確認包會順著流水線逆流而上,經過各個節點到達客戶端。
讀取:
HDFS提供了一個API可以確定一個資料節點所屬的機架ID,客戶端也可以呼叫API獲取自己所屬的機架ID
-
客戶端請求NameNode,計算出距離client最近的副本,返回後設資料資訊;
當客戶端讀取資料時,從名稱節點獲得資料塊不同副本的存放位置列表,列表中包含了副本所在的資料節點,可以呼叫API來確定客戶端和這些資料節點所屬的機架ID,當發現某個資料塊副本對應的機架ID和客戶端對應的機架ID相同時,就優先選擇該副本讀取資料,如果沒有發現,就隨機選擇一個副本讀取資料 -
客戶端讀取對應資料塊資訊。
本文參考廈門大學林子雨老師的大資料課程