Hadoop系列一HDFS簡介

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合併流程

  1. SNN會定期的檢查NN節點中Edits日誌文件的大小。
  2. 若Edits文件大小或者時間間隔達到合併時機,SNN將請求下載Edits和FsImage文件。
  3. NN在SNN下載文件的同時,創建一個新的Edits文件,後續對文件系統的操作都記錄到該文件中。
  4. SNN將下載的文件進行合併,輸出fsimage.ckpt。
  5. SNN通知NN節點,讓NN節點下載fsimage.ckpt,並替換原來的fsimage文件。同時將edits.new文件重命名爲edits。

HDFS讀寫操作

  • 讀操作


    1. 客戶端用FileSystem的open()函數打開文件,DistributedFileSystem用RPC調用元數據節點,得到文件的數據塊信息。對於每個數據塊,元數據節點返回保存數據塊的DataNode節點的地址。
    2. DistributedFileSystem返回FSDataInputStream給客戶端。客戶端調用read()函數開始讀取數據。
    3. FSDataInputStream連接保存保存文件第一個數據塊的最近的數據節點。當數據塊讀取完畢時,FSDataInputStream 關閉和此數據節點的連接,然後開始連接此文件下一個數據塊的最近節點,直到該文件所有數據塊全部被讀取完畢。
    4. 在讀取過程中,如果有DataNode節點通信出現錯誤,則嘗試連接下個包含該數據塊的DataNode節點,失敗的節點被記錄,以後不再連接。
  • 寫操作

    1. 客戶端調用create()創建文件,DistributedFileSystem調用RPC在文件系統的命名空間中創建一個文件。

      NameNode節點需要確認源文文件不存在,並且客戶端有寫入的權限,纔會創建文件。

    2. DistributedFileSystem返回FSDataOutputStream,供客戶端調用寫入文件。

    3. FSDataOutputStream將文件分成塊,寫入data queue。data queue由Data Streamer讀取,並曲子NameNode節點分配數據DataNode節點,用來存儲數據塊。分配的DataNode幾點在一個pipeline裏。

    4. Data Streamer將數據塊寫入pipeline中的第一個DataNode,第一個DataNode將數據塊發送給第二個DataNode,第二個發送到第三個DataNode。

    5. FSOutputStream爲已經發出去的數據塊保存了ack queue,等待pipeline中DataNode告知數據寫入成功。

    6. 如果DataNode在寫入的過程中失敗:

      • 關閉pipeline,將ack queue中的數據塊放入data queue的開始。
      • NameNode標識已經寫入數據塊的DataNode節點,則錯誤節點在重啓後可以察覺其數據塊是過時的,會將其刪除。
      • NameNode節點會被通知此數據塊時副本不足,將來會創建新的副本。
    7. 當客戶端結束寫入數據,則調用close函數,此操作將所有數據庫寫入pipeline中的DataNode節點,並等待ack queue返回成功,最後通知NameNode節點寫入完畢。

Block數據塊

  1. 第一個副本放在上傳文件的DN上,如果是集羣外提交,則隨機挑選一臺,cpu不忙的節點。
  2. 第二個副本放在與第一個副本不同機架的節點上。
  3. 第三個副本與第二個副本放在相同機架的節點上。

文件權限

HDFS支持權限控制,但比較弱,支持按用戶、用戶組、其他用戶的讀寫執行控制權限。HDFS權限目的還是阻止好人做錯事,而不是阻止壞人做壞事。用戶上傳文件到HDFS,那麼文件所有者就是該用戶,不管Linux中該用戶是否存在。

安全模式

當集羣啓動時,會首先進入安全模式。NameNode節點首先將映像文件(fsimage)載入內存,並執行編輯日誌(edits)中各項操作。一旦在內存中成功建立文件系統元數據的映射,則創建一個新的fsimage文件(這個操作不需要SecondaryNameNode)和一個空的編輯日誌。

此刻NameNode運行在安全模式,即NameNode的文件系統對於客戶端來僅僅是可讀的。(只顯示目錄、文件內容等,寫、刪除、重命名都會失敗)。

該階段NameNode收集各個DataNode的報告,當檢測到副本數不足的數據塊時,該塊會被複制直到達到最小副本數。數據塊達到最小副本數以上時,會被認爲是安全的。在一定比例的數據塊被確定爲安全後,過若干時間,安全模式結束。

HDFS優缺點

優點:

  • 高容錯性
  • 適合批處理
  • 適合大數據處理
  • 可以構建在廉價機器上。

缺點:

  • 低延遲數據訪問,比如毫秒級、低延遲與高吞吐量。
  • 小文件存取佔用NameNode大量內存,尋道時間超過讀取時間。
  • 不支持併發寫入、文件隨機修改。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章