Element el-table實現單選操作
HDFS由namenode以及datanode兩個角色組成
NameNode
作用
1、NameNode 負責整個分散式檔案系統的元資料(MetaData)管理,也就是檔案路徑名、資料塊的 ID 以及儲存位置等資訊
2、接受DD上報的資訊
3、給DD分配任務(維護副本數)
元資料的儲存檔案方式:edits與fsimages
元資料保存於記憶體+硬碟(fsimage檔案、edits檔案中),記憶體中的全量資料用於加速NameNode讀取處理元資料的速度,而持久化的fsimage以及edits用於配合儲存元資料,在能保證元資料安全的前提下加快儲存恢復的速度,edits提升增量寫元資料的速度,fsimages(執行checkpoint策略:1h or 100萬次操作)用於整合或者合併操作,加速恢復記憶體元資料所用
存放於${hadoop_home}/data/tmp/dfs/name/current
其實分散式檔案系統玩的就是元資料,由NameNode管理分散式機器中的檔案,就是管理分散式機器中檔案的元資料而已
fsimage
第一次格式化後生成一個fsimages檔案(fsimage_000000000)
NN啟動時會將所有的edits和fsimage檔案全部載入到記憶體合併得到最新的元資料,並將合併後的元資料持久化到一個新的fsimage中
edits
NN啟動後每次的寫命令都會記錄到edits檔案中
edits檔案每隔一段時間或大小就會滾動生成一個新的edits檔案
edits_inprogress表示正在寫入的檔案
上傳後操作動作會寫入edits_inprogress_000000000001檔案,讀操作不記錄
inodes: 記錄檔案的屬性和檔案由哪些塊組成,記錄在fsimages、edits檔案中 blocklist: 塊分佈在哪個DataNode中,每次DataNode啟動後自動上報
NameNode元資料管理流程
當各種上傳操作用了一段時間後會變成下面這個樣子
當寫入一段時間後,edits檔案會把之前的51次操作生成一個edits_000000000001-edits_0000000000051檔案,關閉
之後edits_inprogress改為edits_inprogress_000000000052並繼續寫入 這時我關閉NN,再啟動,啟動時會把fsimage_000000000+edits_000000000001-edits_0000000000051+edits_inprogress_000000000052合併生成一個fsimage_000000052(策略:1小時或100萬次操作) 這時繼續上傳檔案變成上面那樣,這時再關閉重啟,重啟後只會載入比52大的檔案(找最新的元資料檔案載入):fsimage_000000052+edits_000000000053-edits_0000000000055DataNode
一個數據塊在DataNode上以檔案形式儲存在磁碟上,包括兩個檔案,一個是資料本身,一個是元資料包括資料塊的長度,塊資料的校驗(crc校驗演算法,使用者資料完整性校驗)和,以及時間戳(mate)
${hadoop_home}/data/tmp/dfs/data/current/BP-1077754861-192.168.126.128-1629810385198/current/finalized/subdir0/subdir0
DataNode啟動後向NameNode註冊,通過後,週期性(1小時)的向NameNode上報所有的塊資訊
心跳是每3秒一次,心跳返回結果帶有NameNode給該DataNode的命令如複製塊資料到另一臺機器,或刪除某個資料塊。如果超過10分鐘(可以配置)沒有收到某個DataNode的心跳,則認為該節點不可用
NameNode啟動時,將所有的元資料載入完後,等待DataNode上報資料,如果上報的資料不全就會進入安全模式
當安全模式時,無法寫,只能部分讀
上報了的塊數(不考慮副本)/總塊數<99.99 就會進入安全模式,舉個例子,比如有13個塊,你只上報了10個塊,那麼就會進入安全模式
當安全模式時,只能部分讀指的是單個檔案對應的所有的塊都已經上報了則可以讀,否則不可以讀
HDFS特點
HDFS不支援對檔案的隨機寫,只能追加不能修改
檔案在HDFS上儲存時,以block為基本單位儲存
沒有提供對檔案的線上定址(開啟)功能
檔案以塊形式儲存,修改了一個塊中的內容,就會影響當前塊之後所有的塊,效率低
HDFS不適合儲存小檔案
線上歸檔的功能實際是一個MR程式,這個程式將HDFS已經存在的多個小檔案歸檔為一個歸檔檔案
HDFS儲存了大量的小檔案,會降低NN的服務能力
NameNode負責檔案元資料(屬性,塊的對映)的管理,NN在執行時,必須將當前叢集中儲存所有檔案的元資料全部載入到記憶體
存過多小檔案會導致NN佔用大量記憶體
預設塊大小為128M,128M指的是塊的最大大小,每個塊最多儲存128M的資料,如果當前塊儲存的資料不滿128M,存了多少資料,就佔用多少的磁碟空間
一個塊只能屬於一個檔案
HDFS寫資料原理
①服務端啟動HDFS中的NN和DN程序 ②客戶端建立一個分散式檔案系統客戶端,由客戶端向NN傳送請求,請求上傳檔案 ③NN處理請求,檢查客戶端是否有許可權上傳,路徑是否合法等 ④檢查通過,NN響應客戶端可以上傳 ⑤客戶端根據自己設定的塊大小,開始上傳第一個塊,預設0-128M, NN根據客戶端上傳檔案的副本數(預設為3),根據機架感知策略選取指定數量的DN節點返回 ⑥客戶端根據返回的DN節點,請求建立傳輸通道 客戶端向最近(網路舉例最近)的DN節點發起通道建立請求,由這個DN節點依次向通道中的(距離當前DN距離最近) 下一個節點發送建立通道請求,各個節點發送響應 ,通道建立成功(每個DN都是要存相同資料的,冗餘備份) ⑦客戶端每讀取64K的資料,封裝為一個packet(資料包,傳輸的基本單位),將packet傳送到通道的下一個節點 通道中的節點收到packet之後,落盤(檢驗)儲存,將packet傳送到通道的下一個節點! 每個節點在收到packet後,向客戶端傳送ack確認訊息!