HDFS架構及原理初步瞭解

目錄node

HDFS 是作什麼的
HDFS 從何而來
爲何選擇 HDFS 存儲數據
HDFS 如何存儲數據
HDFS 如何讀取文件
HDFS 如何寫入文件
HDFS 副本存放策略
Hadoop2.x新特性
一、HDFS 是作什麼的服務器

  HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,是基於流數據模式訪問和處理超大文件的需求而開發的,能夠運行於廉價的商用服務器上。它所具備的高容錯、高可靠性、高可擴展性、高得到性、高吞吐率等特徵爲海量數據提供了不怕故障的存儲,爲超大數據集(Large Data Set)的應用處理帶來了不少便利。網絡

二、HDFS 從何而來架構

  HDFS 源於 Google 在2003年10月份發表的GFS(Google File System) 論文。 它其實就是 GFS 的一個克隆版本併發

三、爲何選擇 HDFS 存儲數據app

  之因此選擇 HDFS 存儲數據,由於 HDFS 具備如下優勢:框架

  一、高容錯性分佈式

數據自動保存多個副本。它經過增長副本的形式,提升容錯性。
某一個副本丟失之後,它能夠自動恢復,這是由 HDFS 內部機制實現的,咱們沒必要關心。
  二、適合批處理ide

它是經過移動計算而不是移動數據。
它會把數據位置暴露給計算框架。
  三、適合大數據處理oop

處理數據達到 GB、TB、甚至PB級別的數據。
可以處理百萬規模以上的文件數量,數量至關之大。
可以處理10K節點的規模。
  四、流式文件訪問

一次寫入,屢次讀取。文件一旦寫入不能修改,只能追加。
它能保證數據的一致性。
  五、可構建在廉價機器上

它經過多副本機制,提升可靠性。
它提供了容錯和恢復機制。好比某一個副本丟失,能夠經過其它副原本恢復。
  固然 HDFS 也有它的劣勢,並不適合全部的場合:

  一、低延時數據訪問

好比毫秒級的來存儲數據,這是不行的,它作不到。
它適合高吞吐率的場景,就是在某一時間內寫入大量的數據。可是它在低延時的狀況下是不行的,好比毫秒級之內讀取數據,這樣它是很難作到的。
  二、小文件存儲

存儲大量小文件(這裏的小文件是指小於HDFS系統的Block大小的文件(默認64M))的話,它會佔用 NameNode大量的內存來存儲文件、目錄和塊信息。這樣是不可取的,由於NameNode的內存老是有限的。
小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設計目標。
  三、併發寫入、文件隨機修改

一個文件只能有一個寫,不容許多個線程同時寫。
僅支持數據 append(追加),不支持文件的隨機修改。
四、HDFS 如何存儲數據

  

                  HDFS的架構圖
HDFS架構及原理初步瞭解

  HDFS 採用Master/Slave的架構來存儲數據,這種架構主要由四個部分組成,分別爲HDFS Client、NameNode、DataNode和Secondary NameNode。下面咱們分別介紹這四個組成部分

  一、Client:就是客戶端。

文件切分。文件上傳 HDFS 的時候,Client 將文件切分紅 一個一個的Block,而後進行存儲。
與 NameNode 交互,獲取文件的位置信息。
與 DataNode 交互,讀取或者寫入數據。
Client 提供一些命令來管理 HDFS,好比啓動或者關閉HDFS。
Client 能夠經過一些命令來訪問 HDFS。
  二、NameNode:就是 master,它是一個主管、管理者。

管理 HDFS 的名稱空間
管理數據塊(Block)映射信息
配置副本策略
處理客戶端讀寫請求。
  三、DataNode:就是Slave。NameNode 下達命令,DataNode 執行實際的操做。

存儲實際的數據塊。
執行數據塊的讀/寫操做。
  四、Secondary NameNode:並不是 NameNode 的熱備。當NameNode 掛掉的時候,它並不能立刻替換 NameNode 並提供服務。

輔助 NameNode,分擔其工做量。
按期合併 fsimage和fsedits,並推送給NameNode。
在緊急狀況下,可輔助恢復 NameNode。
五、HDFS 如何讀取文件

HDFS架構及原理初步瞭解

HDFS的文件讀取原理,主要包括如下幾個步驟:

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

HDFS架構及原理初步瞭解

HDFS的文件寫入原理,主要包括如下幾個步驟:

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

namenode如何選擇在哪一個datanode 存儲副本(replication)?這裏須要對可靠性、寫入帶寬和讀取帶寬進行權衡。Hadoop對datanode存儲副本有本身的副本策略,在其發展過程當中一共有兩個版本的副本策略,分別以下所示

HDFS架構及原理初步瞭解

八、hadoop2.x新特性

引入了NameNode Federation,解決了橫向內存擴展
引入了Namenode HA,解決了namenode單點故障
引入了YARN,負責資源管理和調度
增長了ResourceManager HA解決了ResourceManager單點故障
  一、NameNode Federation

架構以下圖

HDFS架構及原理初步瞭解

存在多個NameNode,每一個NameNode分管一部分目錄
NameNode共用DataNode
  這樣作的好處就是當NN內存受限時,能擴展內存,解決內存擴展問題,並且每一個NN獨立工做相互不受影響,好比其中一個NN掛掉啦,它不會影響其餘NN提供服務,但咱們須要注意的是,雖然有多個NN,分管不一樣的目錄,可是對於特定的NN,依然存在單點故障,由於沒有它沒有熱備,解決單點故障使用NameNode HA

  二、NameNode HA

    解決方案:

基於NFS共享存儲解決方案
基於Qurom Journal Manager(QJM)解決方案
    一、基於NFS方案

      Active NN與Standby NN經過NFS實現共享數據,但若是Active NN與NFS之間或Standby NN與NFS之間,其中一處有網絡故障的話,那就會形成數據同步問題

    二、基於QJM方案

  架構以下圖

 
HDFS架構及原理初步瞭解
  Active NN、Standby NN有主備之分,NN Active是主的,NN Standby備用的

  集羣啓動以後,一個namenode是active狀態,來處理client與datanode之間的請求,並把相應的日誌文件寫到本地中或JN中;

  Active NN與Standby NN之間是經過一組JN共享數據(JN通常爲奇數個,ZK通常也爲奇數個),Active NN會把日誌文件、鏡像文件寫到JN中去,只要JN中有一半寫成功,那就代表Active NN向JN中寫成功啦,Standby NN就開始從JN中讀取數據,來實現與Active NN數據同步,這種方式支持容錯,由於Standby NN在啓動的時候,會加載鏡像文件(fsimage)並週期性的從JN中獲取日誌文件來保持與Active NN同步

  爲了實現Standby NN在Active NN掛掉以後,能迅速的再提供服務,須要DN不只須要向Active NN彙報,同時還要向Standby NN彙報,這樣就使得Standby NN能保存數據塊在DN上的位置信息,由於在NameNode在啓動過程當中最費時工做,就是處理全部DN上的數據塊的信息

  爲了實現Active NN高熱備,增長了FailoverController和ZK,FailoverController經過Heartbeat的方式與ZK通訊,經過ZK來選舉,一旦Active NN掛掉,就選取另外一個FailoverController做爲active狀態,而後FailoverController經過rpc,讓standby NN轉變爲Active NN

  FailoverController一方面監控NN的狀態信息,一方面還向ZK定時發送心跳,使本身被選舉。當本身被選爲主(Active)的時候,就會經過rpc使相應NN轉變Active狀態
相關文章
相關標籤/搜索