文章目錄
1. HDFS 副本存放機制
第一份數據來源於客戶端
第二份存放的位置是與第一個副本在相同機架上,且不在同一個節點,按照一定的規則(cpu 內存 IO是用率,和硬盤剩餘容量)找到一個節點存放
第三份副本的存放位置是與第一第二份數據副本不在同一個機架上,且邏輯與存放副本一和二的機架距離最近的機上,按照一定的規則(cpu 內存 IO是用率,和硬盤剩餘容量)找到一個節點進行存放
2. HDFS數據寫入流程
- client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
- client請求第一個block該傳輸到哪些DataNode服務器上;
- NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:
A,B,C; - client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,後逐級返回client;
- client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
- 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipelineack發送給client;
- 關閉寫入流。
- 當一個block傳輸完成之後,client再次請求NameNode上傳第二個block到服務器。
3. HDFS數據讀取流程
- 客戶端通過調用FileSystem對象的open()來讀取希望打開的文件。
- Client向NameNode發起RPC請求,來確定請求文件block所在的位置;
- NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block副本的 DataNode 地址; 這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;
- Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那麼將從本地直接獲取數據(短路讀取特性);
- 底層上本質是建立 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;
- 並行讀取,若失敗重新讀取
- 當讀完列表的 block 後,若文件讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;
- 返回後續block列表
- 最終關閉讀流,並將讀取來所有的 block 會合併成一個完整的最終文件。
4. HDFS數據完整性
數據在寫入之後進行校驗和的計算,DataNode週期性進行校驗和計算,將計算結果與第一次的結果進行對比。若相同表示無數據丟失,若不相同表示數據有丟失,丟失進行數據恢復。
數據讀取之前對數據進行校驗,與第一次的結果進行對比。若相同表示數據沒有丟失,可以讀取。若不相同表示數據有所丟失。到其他副本讀取。
5. HDFS適用場景
一次寫入,多次讀出的場景。支持數據在文件尾追加。不支持在文件中間追加或修改。
6. HDFS特性
- 海量數據存儲: HDFS可橫向擴展,其存儲的文件可以支持PB級別數據。
- 高容錯性:節點丟失,系統依然可用,數據保存多個副本,副本丟失後自動恢復。可構建在廉價(與小型機大型機比)的機器上,實現線性擴展(隨着節點數量的增加,集羣的存儲能力,計算能力隨之增加)。
- 大文件存儲:DFS採用數據塊的方式存儲數據,將一個大文件切分成多個小文件,分佈存儲。
7. HDFS缺點
-
不能做到低延遲數據訪問: HDFS 針對一次性讀取大量數據繼續了優化,犧牲了延遲性。
-
不適合大量的小文件存儲 :
A:由於namenode將文件系統的元數據存儲在內存中,因此該文件系統所能存儲的文件總數受限於namenode的內存容量。B:每個文件、目錄和數據塊的存儲信息大約佔150字節。由於以上兩個原因,所以導致HDFS不適合大量的小文件存儲
-
文件的修改; 不適合多次寫入,一次讀取(少量讀取)
-
不支持多用戶的並行寫。
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. 什麼時候進行文件拷貝合併
- dfs.namenode.checkpoint.period :3600 默認情況下 一小時合併一次
- dfs.namenode.checkpoint.txns :1000000 100W次集羣操作,進行一次合併