HDFS讀寫流程
HDFS儲存資料
架構圖
HDFS 採用Master/Slave的架構來儲存資料,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。
Client:就是客戶端。
1、切分檔案:檔案上傳 HDFS 的時候,Client 將檔案切分成 一個一個的Block,然後進行儲存。
2、與 NameNode 互動,獲取檔案的位置資訊。
3、與 DataNode 互動,讀取或者寫入資料。
4、Client 提供一些命令來管理 HDFS,比如啟動或者關閉HDFS。
5、Client 可以通過一些命令來訪問 HDFS。
NameNode:就是 master,它是一個主管、管理者。
1、管理 HDFS 的名稱空間(namespace)。
2、管理資料塊(Block)對映資訊
3、配置副本策略
4、處理客戶端讀寫請求。
DataNode:就是Slave,NameNode 下達命令,DataNode 執行實際的操作。
1、儲存實際的資料塊。
2、執行資料塊的讀/寫操作。
Secondary NameNode:並非 NameNode 的熱備份(兩個節點同時執行,一個掛掉了切換另一個)。當NameNode 掛掉的時候,它並不能馬上替換 NameNode 並提供服務。
1、輔助 NameNode,分擔其工作量。
2、定期合併 fsimage和fsedits,並推送給NameNode。
3、在緊急情況下,可輔助恢復 NameNode。
HDFS讀寫資料流程
HDFS寫資料流程
客戶端將資料寫入HDFS的流程圖如下: 流程如下:
1).客戶端發出請求 hdfs dfs -put /xxx / 2).namenode檢視維護的目錄結構,檢查/qf/data是否存在,如不存在直接報錯”no such file or directory“, 如存在返回給客戶端同意上傳檔案請求,將操作寫入日誌檔案 3).客戶端請求上傳第一個塊,詢問namenode塊的儲存位置 4).namenode檢視自己的datanode池,返回給客戶端一個datanode列表 5).客戶端發出請求建立pipeline 6).客戶端先把檔案寫入快取,達到一個塊的大小時,會在客戶端和第一個datanode建立連線開始流式的傳輸資料, 這個datanode會一小部分一小部分(4K)的接收資料然後寫入本地倉庫,同時會把這些資料傳輸到第二個datanode, 第二個datanode也同樣一小部分一小部分的接收資料並寫入本地倉庫,同時傳輸給第三個datanode (在流式複製時,逐級傳輸和響應採用響應佇列來等待傳輸結果。佇列響應完成後返回給客戶端) 7).第一個資料塊傳輸完成後會使用同樣的方式傳輸下面的資料塊直到整個檔案上傳完成。 8).整個檔案完成,namenode更新記憶體元資料
HDFS讀資料流程
客戶端讀取HDFS中的資料流程圖如下:
1) 客戶端向namenode發起RPC呼叫,請求讀取檔案資料。 2) namenode檢查檔案是否存在,如果存在則獲取檔案的元資訊(blockid以及對應的datanode列表)。 3) 客戶端收到元資訊後選取一個網路距離最近的datanode,依次請求讀取每個資料塊。客戶端首先要校檢檔案是否損壞,如果損壞,客戶端會選取另外的datanode請求。 4) datanode與客戶端建立socket連線,傳輸對應的資料塊,客戶端收到資料快取到本地,之後寫入檔案。 5) 依次傳輸剩下的資料塊,直到整個檔案合併完成。
HDFS的安全威脅
大量小檔案上傳問題 (拒絕服務)
namenode中的塊對映表,名稱空間資料 檔案元資料佔空間大
消耗cpu
尋找檔案耗時 拒絕服務
隨著檔案數增加 上傳檔案時間數增加
資料回收的延遲問題(資訊洩露)
在資料回收的過程中,即使檔案系統中的trash資料夾下的資料夾被刪除後(1小時後),資料塊沒有被真正刪除,而是需要等待副本管理器掃描到該塊後才能被徹底刪除(6小時後),即HDFS上刪除檔案一定時間內,datanode上檔案依然存在,導致結果,在延遲時間段內竊取資料
資料塊許可權問題(資訊洩露)
所有資料塊都以明文的方式,按檔案格式儲存在HDFS的資料節點的作業系統之上,塊檔案儲存時在節點上的預設許可權為允許其他使用者讀,導致作業系統上任何使用者都能竊取該資料塊的內容
負載均衡脆弱性問題(資訊洩露+拒絕服務)
節點動態增加時,hadoop不自動提供負載均衡操作(管理員手動操作)
在負載均衡成功後,源資料節點沒有能夠及時刪除已經拷貝走的冗餘資料塊,而是繼續佔用節點空間,造成資源浪費(注意跟垃圾回收的不同)
- 在上述缺陷下,當系統資源不足的情況下,當用戶繼續上傳新檔案但系統沒有可用空間,就會拒絕使用者的上傳操作
偽節點問題(資訊洩露)
datanode和namenode之間的互動資訊會被竊取,以後資料也可能流入這個假的節點中
通過傳送假ip(這個ip可能是正在死亡的節點(合法節點)的),這樣假幾點就會被當做真節點,真節點死亡