1. 程式人生 > >HDFS簡介

HDFS簡介

占用 過程 線程 節點 上進 io操作 color repl 只讀

1.HDFS介紹

HDFS 為了做到可靠性( reliability ) 創建了多份數據塊(data blocks)的復制(replicas,並將它們放置在服務器群的計算節點中(compute nodes),MapReduce就可以在它們所在的節點上處理這些數據了。

1.1.HDFS結構

NameNode DataNode

存儲元數據(文件名,文件屬性) 存儲文件內容

元數據保存在內存中(磁盤中也會有一份),工作過程中在內存中讀數據 文件內容保存在磁盤

保存文件,block,datanode之間的映射關系 維護了block id到datanode本地文件的映射關系

1.2 HDFS
運行機制

  • 一個名字節點和多個數據節點
  • 數據復制(冗余機制)
    • 存放的位置(機架感知策略)
    • 故障檢測
    • 數據節點
      • 心跳包(檢測是否宕機)
      • 塊報告(安全模式下檢測)
      • 數據完整性檢測(校驗和比較)
    • 名字節點(日誌文件,鏡像文件)
    • 空間回收機制

1.3.HDFS優點

  • 高容錯性
  • 數據自動保存多個副本
  • 副本丟失後,自動恢復
  • 適合批處理
  • 移動計算而非數據
  • 數據位置暴露給計算框架
  • 適合大數據處理
  • GB\TB甚至PB級數據
  • 百萬規模以上的文件數量
  • 10k+節點
  • 可構建在廉價機器上
  • 通過多副本提高可靠性
  • 提供了容錯和恢復機制

1.4 HDFS缺點

  • 低延遲數據訪問
  • 比如毫秒級
  • 低延遲與高吞吐率
  • 小文件存取
  • 占用NameNode大量內存
  • 尋道時間超過讀取時間
  • 並發寫入、文件隨即修改
  • 一個文件只能有一個寫者
  • 僅支持append

NameNode存儲的是元數據,元數據的多少取決於文件的多少,元數據是存儲在內存中的。

不適合大量的小文件存儲

國內大部分網盤是用的HDFS

1.5 HDFS架構

技術分享

HDFS客戶端請求的是NameNode, NameNode負責處理任務的請求,NameNode再將請求轉發給DataNode,請求DataNode實際是HDFS客戶端請求,圖有問題。

DataNode把所有數據都存儲在磁盤上

1.5.1 HDFS數據存儲單元(block

  • 文件被切分成固定大小的數據塊
  • 默認數據塊大小為64mb,可配置
  • 若文件大小不到64mb,則單獨存成一個block
  • 一個文件存儲方式
  • 按大小被切分成若幹個block,存儲到不同節點上
  • 默認情況下每個block都有三個副本
  • block大小和副本數通過client端上傳文件時設置,文件上傳成功後副本數可以變更,Block Size 不可變更

一個塊只可能存一個文件中的數據。只是一個邏輯結構,若不滿64mb的,磁盤上存儲的是文件的實際大小。

技術分享

三個副本存儲在不同機器上

1.6節點

1.6.1 NameNodeNN

  • NameNode主要功能:接受客戶端的讀寫服務
  • NameNode保存metadata(元數據)信息包括
  • 文件owership 和 permissions
  • 文件包含哪些塊
  • block保存在哪個DataNode上(由DataNode啟動時上報,存在內存中)
  • NameNode的metadate信息在啟動後會加載到內存
  • metadata存儲到磁盤文件名為 fsimage
  • block的位置信息不會保存到 fsimage
  • edits記錄對metadata的操作日誌

整個過程中,metadata記錄的信息,磁盤中有一份,內容中也會有一份。(block位置信息不會保存在磁盤中)

如果啟動後進行了新添加文件的操作,那麽這個操作就會記錄到edits日誌文件中,並不會馬上修改fsimage文件,後期會進行合並操作。

NameNode工作的數據都在內存上

1.6.2 SecondaryNameNode(SNN)

  • 它不是NN的備份(但可以做備份),它的主要工作是幫助NN合並edits log,減少NN啟動時間
  • SNN執行合並時機
  • 根據配置文件設置的時間間隔fs.checkpoint.period 默認是3600
  • 根據配置文件設置edits log大小 fs.checkpoint.size規定edits文件的最大值,默認是64mb

合並會有大量的IO操作,如果合並操作由NameNode自己做的話,那麽計算機將會分配大量的內存空間給NameNode來做合並,會影響用戶的使用,NameNode主要是用來接收用戶的請求操作的,合並由SecondaryNameNode來做的話,可保證NameNode工作的專一性,提供性能。

SecondaryNameNode合並後會生成一個新的fsimage,會將該文件傳送給NameNode,替換原來的fsimage

合並流程:

技術分享

fsimage: 磁盤中的元數據文件

edits: 日誌記錄文件

在將 edits、fsimage拷貝到SecondaryNameNode的同時,NameNode會新建一個edits文件,來記錄用戶的操作,edits文件為上次合並的時候產生的新的edits 文件。

在SecondaryNameNode將edits 和 fsimage合並成一個新的fsimage文件,合並之後,將fsimage推送給NameNode, NameNode將之前的fsimage替換掉

不是熱備,如果NameNode掛掉,那麽將會損失edits.new中的文件操作。

1.6.3 DataNode(DN)

  • 存儲數據(block
  • 啟動DN線程的時候會向NN匯報block信息
  • 通過向NN發送心跳保持與其聯系(3秒一次),如果NN10分鐘沒有收到DN的心跳,則認為其已經lost,並copy其上的block到其它DN

1.6.3.1 Block的副本放置策略

  • 第一個副本:放置在上傳文件的DN

如果是集群外提交,則隨機挑選一臺磁盤不太滿,CPU不太忙的節點

  • 第二個副本:放置在於第一個副本不同的機架的節點上
  • 第三個副本:與第二個副本相同機架的節點。
  • 更多副本:隨機節點。

機架:在節點的配置文件中會標明屬於哪個機架。

1.7 HDFS讀流程

技術分享

在客戶端調用api請求NameNode,NameNode返回給數據塊的位置信息

客戶端拿到數據塊的位置信息後,通過另一個API並發的去讀各個block,拿到block之後合並為一個文件。(一般是讀小的文件)

1.8 HDFS寫流程

技術分享

1.客戶端調用 Distributed FileSystem API ,參數包括文件信息,文件的擁有者2.NameNode拿到文件信息後,就可以計算出需要切幾個block,block分別存儲在哪些DataNode上,返回給客戶端

3.客戶端獲取之後,通過接口FSData CutputStream API 先將一個block寫入到DataNode中,其余的副本由DataNode開啟新的線程根據副本放置規則,往其它DataNode上進行復制。

4.復制完成後會返回一個回饋信息,然後再將該信息匯報給NameNode

註:DataNode中的副本,是由第一個接收到block的DataNode復制產生的。

1.9 HDFS文件權限

  • 與Linux文件權限類似
    • r : read
    • w : write
    • x : execute,權限x對於文件忽略,對於文件夾表示是否允許訪問其內容。
  • 如果Linux系統用戶zhangsan使用hadoop命令創建一個文件,那麽這個文件在HDFS 中 owner 就是zhangsan
  • HDFS的權限目的:阻止好人做錯事,而不是阻止壞人做壞事。HDFS相信,你告訴我你是誰,我就認為你是誰。

註:現在好像加密碼認證了。

1.10 安全模式

  • NameNode啟動的時候,首先將映射文件(fsimage)載入內存,並執行編輯日誌(edits)中的各項操作
  • 一旦在內存中成功建立文件系統元數據的映射,則創建一個新的fsimage文件(這個操作不需要SecondaryNameNode)和一個空的編輯日誌
  • 此刻NameNode運行在安全模式。即NameNode的文件系統對於客戶端來說是只讀的。(顯示目錄,顯示文件內容等。寫、刪除、重命名都會失敗)
  • 在此階段NameNode收集各個DataNode的報告,當數據塊達到最小副本數以上時,會被認為是安全的,在一定比例(可設置)的數據塊被確定為安全後,再過若幹時間,安全模式結束。
  • 當檢測到副本數不足的數據塊時,該快會被復制知道達到最小副本數,系統中數據塊的位置並不是由NameNode維護的,而是以塊列表形式存儲在DataNode中。

在剛啟動HDFS的時候,會先進入一個安全模式,此模式下只可進行讀操作。

HDFS簡介