什麼是HDFS?
HDFS ----- Hadoop Distributed File System (hadoop 分布式檔案系統)
概念: 它是一個分布式叢集,可以支援海量資料存儲,hadoop架構的核心之一以及重要元件
基礎儲備
-
什麼是分布式?什麼是叢集? 叢集和分布式的差別?
(獨立概念,分布式是用多台計算機并行解決不同問題、叢集是整合多台計算機解決相同問題)
-
什麼是主從模式?
(分布式系統節點為主從關系、分布執行且保證資料一緻,相關概念:高可用模式、聯邦模式)
-
什麼是NameNode 、DataNode 、secondaryNameNode ,以及它們扮演的角色?
(名稱節點控制作用、資料節點存儲作用、助理節點備份控制節點作用)
起源:
① 技術來源(基礎):Google 公司提出的三篇論文 之 GFS
② 需求來源(設想):提供一種較廉價的海量資料存儲的解決方案
實作過程:
a、解決海量資料存儲問題;—— 化整為零,搭建叢集進行分布式存儲
b、存儲節點的管理問題;—— 采用分布式管理的主從模式(将資料分布情況放到主節點上)
注意事項:1.x的secondary隻做備份,屬于冷備份,需手動轉換namenode;2.x支援熱備,高可用HA特性,一個是active,一個是standby
c、解決存儲成本問題; —— 利用廉價PC來代替小型機或伺服器 搭建叢集
d、解決PC做叢集節點帶來機器故障問題; —— 副本備份,提供容錯(datanode資料)【從控制節點角度看,存在單點故障,即控制節點當機,整個存儲系統崩潰,2.x緩解了該問題】
e、節點故障快速檢測問題;——Fsimage與EditLog存儲以及心跳機制
f、 存儲節點故障優化問題;—— 将檔案分塊儲存在不同的機器上,解決存儲負荷,友善負載均衡與後面的副本管理(對應問題d);
g、減少分塊帶來的影響(尋址時間增加)——将資料塊設定成相同的,盡量将資料塊的大小加大,進而縮短尋址時間
h、解決大量大檔案存儲問題 ——将資料塊或存儲單元設定成較大容量,2.x由64M提高到128M
i、優化讀取或寫入效率 —— 機架政策(第2個政策提高容錯)、采用就近存儲或讀取
j、節點故障的應對措施 ——安全模式,停止會影響中繼資料的操作,防止新增資料丢失
k、緩解存儲節點壓力 ——負載均衡,資料存儲占比、副本遷移管理
圖1-hdfs基本結構 (圖檔來源于網絡)
特點:
① 四大機制:心跳機制、機架政策、安全模式、負載均衡 (5、容錯恢複機制?)
② 優缺點(總結):
優點
a、廉價的海量存儲
b、高容錯性
c、存儲大量的大檔案
d、流式資料通路(大規模資料讀取)
e、跨平台
缺點
a、不适用于低延遲通路
b、不适用于大量小檔案
c、不支援檔案任意修改以及多使用者上傳
簡略存儲流程
-
Step1
用戶端 :通過hadoop的shell指令或Java Api來上傳檔案或下載下傳檔案的目标節點,可以在叢集内也可以在叢集外;邏輯分塊處理
NameNode: 校驗用戶端請求(檔案路徑是否存在?檔案權限問題?資料節點是否正常)
接收DateNode塊資訊,對應分塊資訊傳回節點清單(清單順序符合就近原則)
DataNode:将塊資訊彙報給NameNode
-
Step2
用戶端:接收到清單,将資料塊依次存放到對應的DateNode
DataNode: 接收通道中的資料塊,并将資料塊寫入到下一個副本節點通道;
待該資料塊節點寫入完畢後,将資訊告知用戶端,準備下一次資料塊的請求
- Step3,傳回塊資訊到NameNode,更新NameNode;接收DateNode 資料,更新中繼資料
中繼資料管理
概念:什麼是中繼資料?它包含了:
① 檔案、目錄自身的屬性資訊;
② 檔案記錄的資訊的存儲相關的資訊(塊映射、存儲定位);
③ Datanode 資訊
流程:如何管理這些資料的?
持久化存放到磁盤(啟動時會加載到記憶體中,關閉時會自動載入到磁盤)
對象:fsimage 鏡像檔案、Edits 編輯日志(EditLog)
- fsimage : 隻存放中繼資料的檔案屬性、檔案塊映射,并不包含塊對應的存儲位置(由datanode報告,該資訊存儲到記憶體中)
- editLog : 存放的是 Hadoop 檔案系統的所有更改操作(檔案建立,删除或修改)的日志,用戶端操作會錄入到log中。
兩者關系:
fsimage 和 edits 檔案都是經過序列化的,在 NameNode 啟動的時候,它會将 fsimage檔案中的内容加載到記憶體中,之後再執行 edits 檔案中的各項操作,使得記憶體中的中繼資料和實際的同步,存在記憶體中的中繼資料支援用戶端的讀操作,也是最完整的中繼資料。
合并操作:SecondaryNameNode 對 fsimage 和 editLog進行合并操
-
過程 Checkpoint :
secondary 從namenode的fsimage 和 editlog進行下載下傳并加載到記憶體,此時,namenode生成一個新的editLog(edits.new),此時secondary 根據兩個檔案生成Fsimage.ckpt,最後複制到 namenode的 fsimage.
-
作用:
及時同步中繼資料内容,保證資料的一緻性
-
特點:
通過記憶體載入的方式加快讀取速度,通過定時持久化到磁盤保證資料的安全
HDFS的讀取流程
HDFS的寫入流程
HDFS的RPC機制
RPC的全稱為遠端過程調用,即hadoop底層通信是基于RPC協定的。解決的問題,控制遠端計算機,調用目标上的計算資源(記憶體、cpu等)
- 地位:它屬于會話層協定(OSI網絡協定的第5層),其下層是基于TCP/IP,UDP協定。
- 流程簡述: 生成一個代理agent 作為用戶端在目标機器上的本地使用者,實作類本地指令來操作目标計算機。如圖所示,stub是進行了序列化和反序列化操作。
圖3-RPC流程 圖檔來源于網絡
可以看成是四個部分組成:序列化層、函數調用層、網絡傳輸層和伺服器端處理
1)首先需要定義一個PRC協定,該接口必須繼承VersionedProtocol接口
2)需要一個類實作PRC的接口用于服務端的調用
3)實作用戶端和服務端
hadoop HDFS-RPC接口
圖檔來源于網絡
protocol | 解釋說明 |
---|---|
ClientProtocol | client和namenode 進行互動的接口; |
namenode響應的操作,主要包括hdfs檔案讀寫的相關操作,hdfs命名空間,快照,緩存相關的操作。 | |
讀取:擷取位置 getBlockLocations(),reportBadBlocks() 彙報錯誤的資料塊; | |
寫入:create()建立新檔案,addBlock()擷取新增塊位置,建立pipeline; | |
ClientDataNodeProtocol | client和datanode進行互動的接口; |
用戶端擷取datanode節點資訊,并非寫入資料接口; | |
DatanodeProtocol | datanode和namenode進行互動的接口; |
datanode則是通過該接口向namenode進行注冊,彙報塊資訊和緩存資訊; | |
① 握手versionRequest()主要是傳回namenode的一些命名空間ID,叢集ID,hdfs的版本号等,datanode收到資訊後進行校驗對比,判斷是否能夠與該namenode協同工作,能否注冊。 | |
② datanode會定期的向namenode發送心跳 | |
③ 塊彙報後會根據datanode上報資料塊存儲情況建立資料塊與datanode節點的對應關系。blockReport()在啟動的時候和指定時間間隔的情況下發生。cacheReport()和blockReport()方法完全一緻。隻不過是彙報目前datanode上的緩存的所有資料塊。 | |
datanode會向namenode彙報損壞的資料塊,以及定期性namenode彙報datanode新接手的資料塊或者删除的資料塊。 | |
InterDatanodeProtocol | datanode和datanode間的接口,主要用于資料塊的恢複操作 |
NamenodePortocol | 主要用于namenode的ha機制,或者單節點的情況下是secondaryNamenode也namenode之間的通信接口。 |
時間同步 rdate
rdate -s time.nist.gov
rdate -s time-a.nist.gov