深刻理解HDFS的架構和原理

HDFS主要是用於作什麼的? 

HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,能夠運行於廉價的商用服務器上。node

它所具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集(Large Data Set)的應用處理帶來了不少便利。服務器

HDFS的優缺點比較

優勢

  1. 高容錯性
    (1)數據自動保存多個副本。它經過增長副本的形式,提升容錯性
    (2)某一個副本丟失之後,它能夠自動恢復,這是由 HDFS 內部機制實現的,咱們沒必要關心
  2. 適合批處理
    (1)它是經過移動計算而不是移動數據
    (2)它會把數據位置暴露給計算框架
  3. 適合大數據處理
    (1)處理數據達到 GB、TB、甚至PB級別的數據
    (2)可以處理百萬規模以上的文件數量,數量至關之大
    (3)可以處理10K節點的規模
  4. 流式文件訪問
    (1)一次寫入,屢次讀取。文件一旦寫入不能修改,只能追加
    (2)它能保證數據的一致性
  5. 可構建在廉價機器上
    (1)它經過多副本機制,提升可靠性
    (2)它提供了容錯和恢復機制。好比某一個副本丟失,能夠經過其它副原本恢復

缺點

  1. 低延時數據訪問
    (1)好比毫秒級的來存儲數據,這是不行的,它作不到
    (2)它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。可是它在低延時的狀況下是不行的,好比毫秒級之內讀取數據,這樣它是很難作到的
  2. 小文件存儲
    (1)存儲大量小文件的話,它會佔用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,由於NameNode的內存老是有限的
    (2)小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標
  3. 併發寫入、文件隨機修改
    (1)一個文件只能有一個寫,不容許多個線程同時寫
    (2)僅支持數據 append(追加),不支持文件的隨機修改

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,它是一個主管、管理者app

  1. 管理 HDFS 的名稱空間
  2. 管理數據塊(Block)映射信息
  3. 配置副本策略
  4. 處理客戶端讀寫請求

DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操做框架

  1. 存儲實際的數據塊
  2. 執行數據塊的讀/寫操做
  3. 按期向NameNode發送心跳消息

Secondary NameNode:並不是 NameNode 的熱備。當NameNode 掛掉的時候,它並不能立刻替換 NameNode 並提供服務分佈式

  1. 輔助 NameNode,分擔其工做量
  2. 按期合併 fsimage和fsedits,並推送給NameNode
  3. 在緊急狀況下,可輔助恢復 NameNode

HDFS 如何讀取文件?

这里写图片描述

  1. 首先調用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。
  2. DistributedFileSystem經過RPC(遠程過程調用)得到文件的第一批block的locations,同一block按照重複數會返回多個locations,這些locations按照Hadoop拓撲結構排序,距離客戶端近的排在前面。
  3. 前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream能夠方便的管理datanode和namenode數據流。客戶端調用read方 法,DFSInputStream就會找出離客戶端最近的datanode並鏈接datanode。
  4. 數據從datanode源源不斷的流向客戶端。
  5. 若是第一個block塊的數據讀完了,就會關閉指向第一個block塊的datanode鏈接,接着讀取下一個block塊。這些操做對客戶端來講是透明的,從客戶端的角度來看只是讀一個持續不斷的流。
  6. 若是第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,而後繼續讀,若是全部的block塊都讀完,這時就會關閉掉全部的流。

HDFS 如何寫入文件? 

这里写图片描述

  1. 客戶端經過調用 DistributedFileSystem 的create方法,建立一個新的文件。
  2. DistributedFileSystem 經過 RPC(遠程過程調用)調用 NameNode,去建立一個沒有blocks關聯的新文件。建立前,NameNode 會作各類校驗,好比文件是否存在,客戶端有無權限去建立等。若是校驗經過,NameNode 就會記錄下新文件,不然就會拋出IO異常。
  3. 前兩步結束後會返回 FSDataOutputStream 的對象,和讀文件的時候類似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 能夠協調 NameNode和 DataNode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,而後排成隊列 data queue。
  4. DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode裏,好比重複數是3,那麼就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。
  5. DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應,當pipeline中的全部DataNode都表示已經收到的時候,這時akc queue纔會把對應的packet包移除掉。
  6. 客戶端完成寫數據後,調用close方法關閉寫入流。
  7. DataStreamer 把剩餘的包都刷到 pipeline 裏,而後等待 ack 信息,收到最後一個 ack 後,通知 DataNode 把文件標示爲已完成。

數據管理策略

1. 數據塊副本,數據分佈在不一樣DataNode和不一樣機架上,提升容錯率oop

2. 心跳檢測大數據

3. 二級NameNodespa

相關文章
相關標籤/搜索