HDFS介紹

1. HDFS 副本存放機制

第一份數據來源於客戶端
第二份存放的位置是與第一個副本在相同機架上,且不在同一個節點,按照一定的規則(cpu 內存 IO是用率,和硬盤剩餘容量)找到一個節點存放
第三份副本的存放位置是與第一第二份數據副本不在同一個機架上,且邏輯與存放副本一和二的機架距離最近的機上,按照一定的規則(cpu 內存 IO是用率,和硬盤剩餘容量)找到一個節點進行存放
在這裏插入圖片描述

2. HDFS數據寫入流程

在這裏插入圖片描述

  1. client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
  2. client請求第一個block該傳輸到哪些DataNode服務器上;
  3. NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:
    A,B,C;
  4. client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,後逐級返回client;
  5. client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
  6. 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipelineack發送給client;
  7. 關閉寫入流。
  8. 當一個block傳輸完成之後,client再次請求NameNode上傳第二個block到服務器。

3. HDFS數據讀取流程

在這裏插入圖片描述

  1. 客戶端通過調用FileSystem對象的open()來讀取希望打開的文件。
  2. Client向NameNode發起RPC請求,來確定請求文件block所在的位置;
  3. NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block副本的 DataNode 地址; 這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;
  4. Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那麼將從本地直接獲取數據(短路讀取特性);
  5. 底層上本質是建立 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;
  6. 並行讀取,若失敗重新讀取
  7. 當讀完列表的 block 後,若文件讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;
  8. 返回後續block列表
  9. 最終關閉讀流,並將讀取來所有的 block 會合併成一個完整的最終文件。

4. HDFS數據完整性

在這裏插入圖片描述
數據在寫入之後進行校驗和的計算,DataNode週期性進行校驗和計算,將計算結果與第一次的結果進行對比。若相同表示無數據丟失,若不相同表示數據有丟失,丟失進行數據恢復。
數據讀取之前對數據進行校驗,與第一次的結果進行對比。若相同表示數據沒有丟失,可以讀取。若不相同表示數據有所丟失。到其他副本讀取。

5. HDFS適用場景

一次寫入,多次讀出的場景。支持數據在文件尾追加。不支持在文件中間追加或修改。

6. HDFS特性

  1. 海量數據存儲: HDFS可橫向擴展,其存儲的文件可以支持PB級別數據。
  2. 高容錯性:節點丟失,系統依然可用,數據保存多個副本,副本丟失後自動恢復。可構建在廉價(與小型機大型機比)的機器上,實現線性擴展(隨着節點數量的增加,集羣的存儲能力,計算能力隨之增加)。
  3. 大文件存儲:DFS採用數據塊的方式存儲數據,將一個大文件切分成多個小文件,分佈存儲。

7. HDFS缺點

  1. 不能做到低延遲數據訪問: HDFS 針對一次性讀取大量數據繼續了優化,犧牲了延遲性。

  2. 不適合大量的小文件存儲 :
    A:由於namenode將文件系統的元數據存儲在內存中,因此該文件系統所能存儲的文件總數受限於namenode的內存容量。

    B:每個文件、目錄和數據塊的存儲信息大約佔150字節。由於以上兩個原因,所以導致HDFS不適合大量的小文件存儲

  3. 文件的修改; 不適合多次寫入,一次讀取(少量讀取)

  4. 不支持多用戶的並行寫。

8. HDFS高級命令

  • HDFS上的某一個特定的目錄存儲的數據副本 、數據量、文件的個數進行設置。
  • 設置目錄可以存儲的文件的數量 hdfs dfsadmin -setQuota 100 lisi (文件夾本身算一個)
  • 清空文件夾內數據良方的限制 hdfs dfsadmin -clrQuota /user/root/lisi
  • 限制文件夾下存儲的數據量 hdfs dfsadmin -setSpaceQuota 100M /user/root/lisi
  • 清空文件夾數量的限制 hdfs dfsadmin -clrSpaceQuota /user/root/lisi
  • 查看文件夾的限額數 hdfs dfs -count -q -h /user/root/lisi

9. HDFS安全模式

  • 安全模式是HDFS所處的一種特殊狀態,在這種狀態下,文件系統只接受讀數據請求,而不接受刪除、修改等變更請求。

  • HDFS什麼時候進入安全模式:在NameNode主節點啓動時,HDFS首先進入安全模式

  • 在安全模式下做了什麼: DataNode在啓動的時候會向namenode彙報可用的block等狀態

  • 查看hdfs在什麼模式 hdfs dfsadmin -safemode get

        進入hdfs安全模式 hdfs dfsadmin -safemode enter
        
        退出hdfs安全模式 hdfs dfsadmin -safemode leave
    

10. Fsimage Edits

  • Fsimage 記錄HDFS文件系統的鏡像或快照(週期性記錄)(此文件相對較小)
  • Edits 記錄客戶端對進行的所有的增、刪、改、追加等操作(沒有使用Secondary NameNode之前,不是週期性生成)(此文件相對較大)
  • Fsimage Edits作用:用於還原集羣上次關閉時的狀態。還原時將兩個文件加載到內存,檢查、合併最終生成一個新的Fsimage 。原本的Edits失效。

11. 查看Fsimage Edits

在配置文件hdfs-site.xml中記錄了兩個文件的存放位置。

dfs.namenode.name.dir Fsimage 的存放路徑
dfs.namenode.edits.dir edits日誌存放的路徑

  • 將Fsimage轉換成xml
  hdfs oiv -i fsimage_0000000000000024681 -p XML -o test001.xml
  • 將 Edits轉換成xml
  hdfs oev -i edits_0000000000000000523-0000000000000024565 -p XML -o test002.xml

12. SecondaryNamenode工作原理

前提:不使用SNN,日誌文件會很大,日誌大會導致集羣恢復到上次關機前的狀態花費很長時間,這個時候集羣處於安全模式,集羣不可用。長時間處於安全模式。
目標:加快集羣二次啓動的速度。(減少集羣二次啓動的時間)
SecondaryNamenode週期性複製NameNode的FSIMAGE 和edits到本機(SecondaryNamenode本機),將兩個文件進行合併,最終生成全新的Fsimage,將最新的Fsimage發送回Namenode 。
意義:輔助NameNode合併Fsimage Edits.減小了日誌的大小,加快了集羣的二次啓動速度。
在這裏插入圖片描述
SecondaryNamenode自己獨立部署在有一個節點上。此節點的配置要與NameNode相同。

13. 什麼時候進行文件拷貝合併

  1. dfs.namenode.checkpoint.period :3600 默認情況下 一小時合併一次
  2. dfs.namenode.checkpoint.txns :1000000 100W次集羣操作,進行一次合併
發佈了35 篇原創文章 · 獲贊 244 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章