HDFS的架構(gòu)

參考:初步掌握HDFS的架構(gòu)及原理

1 HDFS 是做什么的

HDFS(Hadoop Distributed File System)是Hadoop項(xiàng)目的核心子項(xiàng)目,是分布式計(jì)算中數(shù)據(jù)存儲(chǔ)管理的基礎(chǔ),是基于流數(shù)據(jù)模式訪問和處理超大文件的需求而開發(fā)的,可以運(yùn)行于廉價(jià)的商用服務(wù)器上。它所具有的高容錯(cuò)、高可靠性、高可擴(kuò)展性、高獲得性、高吞吐率等特征,為海量數(shù)據(jù)提供了不怕故障的存儲(chǔ),為超大數(shù)據(jù)集(Large Data Set)的應(yīng)用處理帶來了很多便利。

2 HDFS 從何而來

HDFS 源于 Google 在2003年10月份發(fā)表的GFS(Google File System) 論文。 它其實(shí)就是 GFS 的一個(gè)克隆版本

3 為什么選擇 HDFS 存儲(chǔ)數(shù)據(jù)

HDFS 具有以下優(yōu)點(diǎn):

1、高容錯(cuò)性

  • 數(shù)據(jù)自動(dòng)保存多個(gè)副本。它通過增加副本的形式,提高容錯(cuò)性。

  • 某一個(gè)副本丟失以后,它可以自動(dòng)恢復(fù),這是由 HDFS 內(nèi)部機(jī)制實(shí)現(xiàn)的,我們不必關(guān)心。

2、適合批處理

  • 它是通過移動(dòng)計(jì)算而不是移動(dòng)數(shù)據(jù)。

  • 它會(huì)把數(shù)據(jù)位置暴露給計(jì)算框架。

3、適合大數(shù)據(jù)處理

  • 處理數(shù)據(jù)達(dá)到 GB、TB、甚至PB級(jí)別的數(shù)據(jù)。

  • 能夠處理百萬規(guī)模以上的文件數(shù)量,數(shù)量相當(dāng)之大。

  • 能夠處理10K節(jié)點(diǎn)的規(guī)模。

4、流式文件訪問

  • 一次寫入,多次讀取。文件一旦寫入不能修改,只能追加。

  • 它能保證數(shù)據(jù)的一致性。

5、可構(gòu)建在廉價(jià)機(jī)器上

  • 它通過多副本機(jī)制,提高可靠性。

  • 它提供了容錯(cuò)和恢復(fù)機(jī)制。比如某一個(gè)副本丟失,可以通過其它副本來恢復(fù)。

HDFS 也有它的劣勢(shì):

1、低延時(shí)數(shù)據(jù)訪問

  • 比如毫秒級(jí)的來存儲(chǔ)數(shù)據(jù),這是不行的,它做不到。

  • 它適合高吞吐率的場(chǎng)景,就是在某一時(shí)間內(nèi)寫入大量的數(shù)據(jù)。但是它在低延時(shí)的情況下是不行的,比如毫秒級(jí)以內(nèi)讀取數(shù)據(jù),這樣它是很難做到的。

2、小文件存儲(chǔ)

  • 存儲(chǔ)大量小文件(這里的小文件是指小于HDFS系統(tǒng)的Block大小的文件(默認(rèn)64M))的話,它會(huì)占用 NameNode大量的內(nèi)存來存儲(chǔ)文件、目錄和塊信息。這樣是不可取的,因?yàn)镹ameNode的內(nèi)存總是有限的。

  • 小文件存儲(chǔ)的尋道時(shí)間會(huì)超過讀取時(shí)間,它違反了HDFS的設(shè)計(jì)目標(biāo)。

3、并發(fā)寫入、文件隨機(jī)修改

  • 一個(gè)文件只能有一個(gè)寫,不允許多個(gè)線程同時(shí)寫。

  • 僅支持?jǐn)?shù)據(jù) append(追加),不支持文件的隨機(jī)修改。

4 HDFS 如何存儲(chǔ)數(shù)據(jù)

HDFS的架構(gòu)圖

HDFS 采用Master/Slave的架構(gòu)來存儲(chǔ)數(shù)據(jù),這種架構(gòu)主要由四個(gè)部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個(gè)組成部分

1、Client:就是客戶端。

  • 文件切分。文件上傳 HDFS 的時(shí)候,Client 將文件切分成 一個(gè)一個(gè)的Block,然后進(jìn)行存儲(chǔ)。
  • 與 NameNode 交互,獲取文件的位置信息。
  • 與 DataNode 交互,讀取或者寫入數(shù)據(jù)。
  • Client 提供一些命令來管理 HDFS,比如啟動(dòng)或者關(guān)閉HDFS。
  • Client 可以通過一些命令來訪問 HDFS。

2、NameNode:就是 master,它是一個(gè)管理者。

  • 管理 HDFS 的名稱空間
  • 管理數(shù)據(jù)塊(Block)映射信息:元數(shù)據(jù)信息
  • 配置副本策略
  • 處理客戶端讀寫請(qǐng)求。

3、DataNode:就是Slave。NameNode 下達(dá)命令,DataNode 執(zhí)行實(shí)際的操作。

  • 存儲(chǔ)實(shí)際的數(shù)據(jù)塊。
  • 執(zhí)行數(shù)據(jù)塊的讀/寫操作。

4、Secondary NameNode:并非 NameNode 的熱備。當(dāng)NameNode 掛掉的時(shí)候,它并不能馬上替換 NameNode 并提供服務(wù)。

  • 輔助 NameNode,分擔(dān)其工作量。
  • 定期合并 fsimage和fsedits,并推送給NameNode。
  • 在緊急情況下,可輔助恢復(fù) NameNode。

5 HDFS 如何讀取文件

HDFS讀取文件

HDFS的文件讀取原理,主要包括以下幾個(gè)步驟:

  • 首先調(diào)用FileSystem對(duì)象的open方法,其實(shí)獲取的是一個(gè)DistributedFileSystem的實(shí)例。
  • DistributedFileSystem通過RPC(遠(yuǎn)程過程調(diào)用)獲得文件的第一批block的locations,同一block按照重復(fù)數(shù)會(huì)返回多個(gè)locations,這些locations按照hadoop拓?fù)浣Y(jié)構(gòu)排序,距離客戶端近的排在前面。
  • 前兩步會(huì)返回一個(gè)FSDataInputStream對(duì)象,該對(duì)象會(huì)被封裝成 DFSInputStream對(duì)象,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流??蛻舳苏{(diào)用read方法,DFSInputStream就會(huì)找出離客戶端最近的datanode并連接datanode。
  • 數(shù)據(jù)從datanode源源不斷的流向客戶端。
  • 如果第一個(gè)block塊的數(shù)據(jù)讀完了,就會(huì)關(guān)閉指向第一個(gè)block塊的datanode連接,接著讀取下一個(gè)block塊。這些操作對(duì)客戶端來說是透明的,從客戶端的角度來看只是讀一個(gè)持續(xù)不斷的流。
  • 如果第一批block都讀完了,DFSInputStream就會(huì)去namenode拿下一批blocks的location,然后繼續(xù)讀,如果所有的block塊都讀完,這時(shí)就會(huì)關(guān)閉掉所有的流。

6 HDFS 如何寫入文件

image

HDFS的文件寫入原理,主要包括以下幾個(gè)步驟:

  • 客戶端通過調(diào)用 DistributedFileSystem 的create方法,創(chuàng)建一個(gè)新的文件。
  • DistributedFileSystem 通過 RPC(遠(yuǎn)程過程調(diào)用)調(diào)用 NameNode,去創(chuàng)建一個(gè)沒有blocks關(guān)聯(lián)的新文件。創(chuàng)建前,NameNode 會(huì)做各種校驗(yàn),比如文件是否存在,客戶端有無權(quán)限去創(chuàng)建等。如果校驗(yàn)通過,NameNode 就會(huì)記錄下新文件,否則就會(huì)拋出IO異常。
  • 前兩步結(jié)束后會(huì)返回 FSDataOutputStream 的對(duì)象,和讀文件的時(shí)候相似,F(xiàn)SDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 可以協(xié)調(diào) NameNode和 DataNode??蛻舳碎_始寫數(shù)據(jù)到DFSOutputStream,DFSOutputStream會(huì)把數(shù)據(jù)切成一個(gè)個(gè)小packet,然后排成隊(duì)列 data queue。
  • DataStreamer 會(huì)去處理接受 data queue,它先問詢 NameNode 這個(gè)新的 block 最適合存儲(chǔ)的在哪幾個(gè)DataNode里,比如重復(fù)數(shù)是3,那么就找到3個(gè)最適合的 DataNode,把它們排成一個(gè) pipeline。DataStreamer 把 packet 按隊(duì)列輸出到管道的第一個(gè) DataNode 中,第一個(gè) DataNode又把 packet 輸出到第二個(gè) DataNode 中,以此類推。
  • DFSOutputStream 還有一個(gè)隊(duì)列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應(yīng),當(dāng)pipeline中的所有DataNode都表示已經(jīng)收到的時(shí)候,這時(shí)akc queue才會(huì)把對(duì)應(yīng)的packet包移除掉。
  • 客戶端完成寫數(shù)據(jù)后,調(diào)用close方法關(guān)閉寫入流。
  • DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一個(gè) ack 后,通知 DataNode 把文件標(biāo)示為已完成。

7 HDFS 副本存放策略

namenode如何選擇在哪個(gè)datanode 存儲(chǔ)副本(replication)?這里需要對(duì)可靠性、寫入帶寬和讀取帶寬進(jìn)行權(quán)衡。Hadoop對(duì)datanode存儲(chǔ)副本有自己的副本策略,在其發(fā)展過程中一共有兩個(gè)版本的副本策略,分別如下所示

image

8 hadoop2.x新特性

  • 引入了NameNode Federation,解決了橫向內(nèi)存擴(kuò)展
  • 引入了Namenode HA,解決了namenode單點(diǎn)故障
  • 引入了YARN,負(fù)責(zé)資源管理和調(diào)度
  • 增加了ResourceManager HA解決了ResourceManager單點(diǎn)故障

1、NameNode Federation

架構(gòu)如下圖

image
  • 存在多個(gè)NameNode,每個(gè)NameNode分管一部分目錄
  • NameNode共用DataNode

這樣做的好處就是當(dāng)NN內(nèi)存受限時(shí),能擴(kuò)展內(nèi)存,解決內(nèi)存擴(kuò)展問題,而且每個(gè)NN獨(dú)立工作相互不受影響,比如其中一個(gè)NN掛掉啦,它不會(huì)影響其他NN提供服務(wù),但我們需要注意的是,雖然有多個(gè)NN,分管不同的目錄,但是對(duì)于特定的NN,依然存在單點(diǎn)故障,因?yàn)闆]有它沒有熱備,解決單點(diǎn)故障使用NameNode HA

2、NameNode HA

解決方案:

  • 基于NFS共享存儲(chǔ)解決方案
  • 基于Qurom Journal Manager(QJM)解決方案

1、基于NFS方案

Active NN與Standby NN通過NFS實(shí)現(xiàn)共享數(shù)據(jù),但如果Active NN與NFS之間或Standby NN與NFS之間,其中一處有網(wǎng)絡(luò)故障的話,那就會(huì)造成數(shù)據(jù)同步問題

2、基于QJM方案

架構(gòu)如下圖

image

Active NN、Standby NN有主備之分,NN Active是主的,NN Standby備用的

集群?jiǎn)?dòng)之后,一個(gè)namenode是active狀態(tài),來處理client與datanode之間的請(qǐng)求,并把相應(yīng)的日志文件寫到本地中或JN中;

Active NN與Standby NN之間是通過一組JN共享數(shù)據(jù)(JN一般為奇數(shù)個(gè),ZK一般也為奇數(shù)個(gè)),Active NN會(huì)把日志文件、鏡像文件寫到JN中去,只要JN中有一半寫成功,那就表明Active NN向JN中寫成功啦,Standby NN就開始從JN中讀取數(shù)據(jù),來實(shí)現(xiàn)與Active NN數(shù)據(jù)同步,這種方式支持容錯(cuò),因?yàn)镾tandby NN在啟動(dòng)的時(shí)候,會(huì)加載鏡像文件(fsimage)并周期性的從JN中獲取日志文件來保持與Active NN同步

為了實(shí)現(xiàn)Standby NN在Active NN掛掉之后,能迅速的再提供服務(wù),需要DN不僅需要向Active NN匯報(bào),同時(shí)還要向Standby NN匯報(bào),這樣就使得Standby NN能保存數(shù)據(jù)塊在DN上的位置信息,因?yàn)樵贜ameNode在啟動(dòng)過程中最費(fèi)時(shí)工作,就是處理所有DN上的數(shù)據(jù)塊的信息

為了實(shí)現(xiàn)Active NN高熱備,增加了FailoverController和ZK,F(xiàn)ailoverController通過Heartbeat的方式與ZK通信,通過ZK來選舉,一旦Active NN掛掉,就選取另一個(gè)FailoverController作為active狀態(tài),然后FailoverController通過rpc,讓standby NN轉(zhuǎn)變?yōu)锳ctive NN

FailoverController一方面監(jiān)控NN的狀態(tài)信息,一方面還向ZK定時(shí)發(fā)送心跳,使自己被選舉。當(dāng)自己被選為主(Active)的時(shí)候,就會(huì)通過rpc使相應(yīng)NN轉(zhuǎn)變Active狀態(tài)

3、結(jié)合HDFS2的新特性,在實(shí)際生成環(huán)境中部署圖

image

這里有12個(gè)DN,有4個(gè)NN,NN-1與NN-2是主備關(guān)系,它們管理/share目錄;NN-3與NN-4是主備關(guān)系,它們管理/user目錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容