HDFS架構
NameNode(NN)
-
接受客戶端的讀寫服務
-
保存metadata信息,包括文件的所屬和權限和文件分割塊信息
-
Block保存在哪個DataNode上(該數據由DataNode上報)
NameNode的metadata信息在啓動後會加載到內存中,metadata信息存儲在磁盤文件fsimage,edits文件記錄對metadata的操作日誌,Block位置信息只存在內存,不保存到fsimage。
SecondaryNameNode(SNN)
不是NN的備份,但是可以備份部分,主要工作是幫助NN合併edits的log,減少NN啓動時間。SNN執行合併時機有2種,1種是間隔3600秒,2是根據edits文件的最大值來確定,默認爲64M。
DataNode(DN)
- 存儲數據(Block)
- 啓動DN線程的時候會向NN彙報block信息
通過向NN發送心跳保持與其聯繫,默認3秒/次,如果NN在10分鐘沒有收到DN的心跳,則認爲其已經lost,並copy其上的block到其他DN。
SNN合併流程
- SNN會定期的檢查NN節點中Edits日誌文件的大小。
- 若Edits文件大小或者時間間隔達到合併時機,SNN將請求下載Edits和FsImage文件。
- NN在SNN下載文件的同時,創建一個新的Edits文件,後續對文件系統的操作都記錄到該文件中。
- SNN將下載的文件進行合併,輸出fsimage.ckpt。
- SNN通知NN節點,讓NN節點下載fsimage.ckpt,並替換原來的fsimage文件。同時將edits.new文件重命名爲edits。
HDFS讀寫操作
-
讀操作
- 客戶端用FileSystem的open()函數打開文件,DistributedFileSystem用RPC調用元數據節點,得到文件的數據塊信息。對於每個數據塊,元數據節點返回保存數據塊的DataNode節點的地址。
- DistributedFileSystem返回FSDataInputStream給客戶端。客戶端調用read()函數開始讀取數據。
- FSDataInputStream連接保存保存文件第一個數據塊的最近的數據節點。當數據塊讀取完畢時,FSDataInputStream 關閉和此數據節點的連接,然後開始連接此文件下一個數據塊的最近節點,直到該文件所有數據塊全部被讀取完畢。
- 在讀取過程中,如果有DataNode節點通信出現錯誤,則嘗試連接下個包含該數據塊的DataNode節點,失敗的節點被記錄,以後不再連接。
-
寫操作
-
客戶端調用create()創建文件,DistributedFileSystem調用RPC在文件系統的命名空間中創建一個文件。
NameNode節點需要確認源文文件不存在,並且客戶端有寫入的權限,纔會創建文件。
-
DistributedFileSystem返回FSDataOutputStream,供客戶端調用寫入文件。
-
FSDataOutputStream將文件分成塊,寫入data queue。data queue由Data Streamer讀取,並曲子NameNode節點分配數據DataNode節點,用來存儲數據塊。分配的DataNode幾點在一個pipeline裏。
-
Data Streamer將數據塊寫入pipeline中的第一個DataNode,第一個DataNode將數據塊發送給第二個DataNode,第二個發送到第三個DataNode。
-
FSOutputStream爲已經發出去的數據塊保存了ack queue,等待pipeline中DataNode告知數據寫入成功。
-
如果DataNode在寫入的過程中失敗:
- 關閉pipeline,將ack queue中的數據塊放入data queue的開始。
- NameNode標識已經寫入數據塊的DataNode節點,則錯誤節點在重啓後可以察覺其數據塊是過時的,會將其刪除。
- NameNode節點會被通知此數據塊時副本不足,將來會創建新的副本。
-
當客戶端結束寫入數據,則調用close函數,此操作將所有數據庫寫入pipeline中的DataNode節點,並等待ack queue返回成功,最後通知NameNode節點寫入完畢。
-
Block數據塊
- 第一個副本放在上傳文件的DN上,如果是集羣外提交,則隨機挑選一臺,cpu不忙的節點。
- 第二個副本放在與第一個副本不同機架的節點上。
- 第三個副本與第二個副本放在相同機架的節點上。
文件權限
HDFS支持權限控制,但比較弱,支持按用戶、用戶組、其他用戶的讀寫執行控制權限。HDFS權限目的還是阻止好人做錯事,而不是阻止壞人做壞事。用戶上傳文件到HDFS,那麼文件所有者就是該用戶,不管Linux中該用戶是否存在。
安全模式
當集羣啓動時,會首先進入安全模式。NameNode節點首先將映像文件(fsimage)載入內存,並執行編輯日誌(edits)中各項操作。一旦在內存中成功建立文件系統元數據的映射,則創建一個新的fsimage文件(這個操作不需要SecondaryNameNode)和一個空的編輯日誌。
此刻NameNode運行在安全模式,即NameNode的文件系統對於客戶端來僅僅是可讀的。(只顯示目錄、文件內容等,寫、刪除、重命名都會失敗)。
該階段NameNode收集各個DataNode的報告,當檢測到副本數不足的數據塊時,該塊會被複制直到達到最小副本數。數據塊達到最小副本數以上時,會被認爲是安全的。在一定比例的數據塊被確定爲安全後,過若干時間,安全模式結束。
HDFS優缺點
優點:
- 高容錯性
- 適合批處理
- 適合大數據處理
- 可以構建在廉價機器上。
缺點:
- 低延遲數據訪問,比如毫秒級、低延遲與高吞吐量。
- 小文件存取佔用NameNode大量內存,尋道時間超過讀取時間。
- 不支持併發寫入、文件隨機修改。