初步掌握HDFS的架构及原理
原文鏈接:http://www.cnblogs.com/codeOfLife/p/5375120.html
目錄
-
HDFS 是做什么的
-
HDFS 從何而來
-
為什么選擇 HDFS 存儲數(shù)據(jù)
-
HDFS 如何存儲數(shù)據(jù)
-
HDFS 如何讀取文件
-
HDFS 如何寫入文件
-
HDFS 副本存放策略
-
Hadoop2.x新特性
1、HDFS 是做什么的
HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分布式計算中數(shù)據(jù)存儲管理的基礎(chǔ),是基于流數(shù)據(jù)模式訪問和處理超大文件的需求而開發(fā)的,可以運行于廉價的商用服務(wù)器上。它所具有的高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率等特征為海量數(shù)據(jù)提供了不怕故障的存儲,為超大數(shù)據(jù)集(Large Data Set)的應(yīng)用處理帶來了很多便利。
2、HDFS 從何而來
HDFS 源于 Google 在2003年10月份發(fā)表的GFS(Google File System) 論文。 它其實就是 GFS 的一個克隆版本
3、為什么選擇 HDFS 存儲數(shù)據(jù)
?之所以選擇 HDFS 存儲數(shù)據(jù),因為 HDFS 具有以下優(yōu)點:
1、高容錯性
-
數(shù)據(jù)自動保存多個副本。它通過增加副本的形式,提高容錯性。
-
某一個副本丟失以后,它可以自動恢復,這是由 HDFS 內(nèi)部機制實現(xiàn)的,我們不必關(guān)心。
2、適合批處理
-
它是通過移動計算而不是移動數(shù)據(jù)。
-
它會把數(shù)據(jù)位置暴露給計算框架。
3、適合大數(shù)據(jù)處理
-
處理數(shù)據(jù)達到 GB、TB、甚至PB級別的數(shù)據(jù)。
-
能夠處理百萬規(guī)模以上的文件數(shù)量,數(shù)量相當之大。
-
能夠處理10K節(jié)點的規(guī)模。
4、流式文件訪問
-
一次寫入,多次讀取。文件一旦寫入不能修改,只能追加。
-
它能保證數(shù)據(jù)的一致性。
5、可構(gòu)建在廉價機器上
-
它通過多副本機制,提高可靠性。
-
它提供了容錯和恢復機制。比如某一個副本丟失,可以通過其它副本來恢復。
當然 HDFS 也有它的劣勢,并不適合所有的場合:
1、低延時數(shù)據(jù)訪問
-
比如毫秒級的來存儲數(shù)據(jù),這是不行的,它做不到。
-
它適合高吞吐率的場景,就是在某一時間內(nèi)寫入大量的數(shù)據(jù)。但是它在低延時的情況下是不行的,比如毫秒級以內(nèi)讀取數(shù)據(jù),這樣它是很難做到的。
2、小文件存儲
-
存儲大量小文件(這里的小文件是指小于HDFS系統(tǒng)的Block大小的文件(默認64M))的話,它會占用 NameNode大量的內(nèi)存來存儲文件、目錄和塊信息。這樣是不可取的,因為NameNode的內(nèi)存總是有限的。
-
小文件存儲的尋道時間會超過讀取時間,它違反了HDFS的設(shè)計目標。
3、并發(fā)寫入、文件隨機修改
-
一個文件只能有一個寫,不允許多個線程同時寫。
-
僅支持數(shù)據(jù) append(追加),不支持文件的隨機修改。
4、HDFS 如何存儲數(shù)據(jù)
HDFS的架構(gòu)圖
HDFS 采用Master/Slave的架構(gòu)來存儲數(shù)據(jù),這種架構(gòu)主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode。下面我們分別介紹這四個組成部分 ??
1、Client:就是客戶端。
- 文件切分。文件上傳 HDFS 的時候,Client 將文件切分成 一個一個的Block,然后進行存儲。
- 與 NameNode 交互,獲取文件的位置信息。
- 與 DataNode 交互,讀取或者寫入數(shù)據(jù)。
- Client 提供一些命令來管理 HDFS,比如啟動或者關(guān)閉HDFS。
- Client 可以通過一些命令來訪問 HDFS。
2、NameNode:就是 master,它是一個主管、管理者。
- 管理 HDFS 的名稱空間
- 管理數(shù)據(jù)塊(Block)映射信息
- 配置副本策略
- 處理客戶端讀寫請求。
3、DataNode:就是Slave。NameNode 下達命令,DataNode 執(zhí)行實際的操作。
- 存儲實際的數(shù)據(jù)塊。
- 執(zhí)行數(shù)據(jù)塊的讀/寫操作。
4、Secondary NameNode:并非 NameNode 的熱備。當NameNode 掛掉的時候,它并不能馬上替換 NameNode 并提供服務(wù)。
- 輔助 NameNode,分擔其工作量。
- 定期合并 fsimage和fsedits,并推送給NameNode。
- 在緊急情況下,可輔助恢復 NameNode。
5、HDFS 如何讀取文件
HDFS的文件讀取原理,主要包括以下幾個步驟:
- 首先調(diào)用FileSystem對象的open方法,其實獲取的是一個DistributedFileSystem的實例。
- DistributedFileSystem通過RPC(遠程過程調(diào)用)獲得文件的第一批block的locations,同一block按照重復數(shù)會返回多個locations,這些locations按照hadoop拓撲結(jié)構(gòu)排序,距離客戶端近的排在前面。
- 前兩步會返回一個FSDataInputStream對象,該對象會被封裝成 DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流??蛻舳苏{(diào)用read方法,DFSInputStream就會找出離客戶端最近的datanode并連接datanode。
- 數(shù)據(jù)從datanode源源不斷的流向客戶端。
- 如果第一個block塊的數(shù)據(jù)讀完了,就會關(guān)閉指向第一個block塊的datanode連接,接著讀取下一個block塊。這些操作對客戶端來說是透明的,從客戶端的角度來看只是讀一個持續(xù)不斷的流。
- 如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然后繼續(xù)讀,如果所有的block塊都讀完,這時就會關(guān)閉掉所有的流。
6、HDFS 如何寫入文件
HDFS的文件寫入原理,主要包括以下幾個步驟:
- 客戶端通過調(diào)用 DistributedFileSystem 的create方法,創(chuàng)建一個新的文件。
- DistributedFileSystem 通過 RPC(遠程過程調(diào)用)調(diào)用 NameNode,去創(chuàng)建一個沒有blocks關(guān)聯(lián)的新文件。創(chuàng)建前,NameNode 會做各種校驗,比如文件是否存在,客戶端有無權(quán)限去創(chuàng)建等。如果校驗通過,NameNode 就會記錄下新文件,否則就會拋出IO異常。
- 前兩步結(jié)束后會返回 FSDataOutputStream 的對象,和讀文件的時候相似,FSDataOutputStream 被封裝成 DFSOutputStream,DFSOutputStream 可以協(xié)調(diào) NameNode和 DataNode??蛻舳碎_始寫數(shù)據(jù)到DFSOutputStream,DFSOutputStream會把數(shù)據(jù)切成一個個小packet,然后排成隊列 data queue。
- DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode里,比如重復數(shù)是3,那么就找到3個最適合的 DataNode,把它們排成一個 pipeline。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推。
- DFSOutputStream 還有一個隊列叫 ack queue,也是由 packet 組成,等待DataNode的收到響應(yīng),當pipeline中的所有DataNode都表示已經(jīng)收到的時候,這時akc queue才會把對應(yīng)的packet包移除掉。
- 客戶端完成寫數(shù)據(jù)后,調(diào)用close方法關(guān)閉寫入流。
- DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一個 ack 后,通知 DataNode 把文件標示為已完成。
7、HDFS 副本存放策略
namenode如何選擇在哪個datanode 存儲副本(replication)?這里需要對可靠性、寫入帶寬和讀取帶寬進行權(quán)衡。Hadoop對datanode存儲副本有自己的副本策略,在其發(fā)展過程中一共有兩個版本的副本策略,分別如下所示
8、hadoop2.x新特性
- 引入了NameNode Federation,解決了橫向內(nèi)存擴展
- 引入了Namenode HA,解決了namenode單點故障
- 引入了YARN,負責資源管理和調(diào)度
-
增加了ResourceManager HA解決了ResourceManager單點故障
1、NameNode Federation
????架構(gòu)如下圖
????
- 存在多個NameNode,每個NameNode分管一部分目錄
- NameNode共用DataNode
這樣做的好處就是當NN內(nèi)存受限時,能擴展內(nèi)存,解決內(nèi)存擴展問題,而且每個NN獨立工作相互不受影響,比如其中一個NN掛掉啦,它不會影響其他NN提供服務(wù),但我們需要注意的是,雖然有多個NN,分管不同的目錄,但是對于特定的NN,依然存在單點故障,因為沒有它沒有熱備,解決單點故障使用NameNode HA
2、NameNode HA
解決方案:
- 基于NFS共享存儲解決方案
- 基于Qurom Journal Manager(QJM)解決方案
1、基于NFS方案
Active NN與Standby NN通過NFS實現(xiàn)共享數(shù)據(jù),但如果Active NN與NFS之間或Standby NN與NFS之間,其中一處有網(wǎng)絡(luò)故障的話,那就會造成數(shù)據(jù)同步問題
2、基于QJM方案
???? 架構(gòu)如下圖
? ? ?
???? Active NN、Standby NN有主備之分,NN Active是主的,NN Standby備用的
???? 集群啟動之后,一個namenode是active狀態(tài),來處理client與datanode之間的請求,并把相應(yīng)的日志文件寫到本地中或JN中;
???? Active NN與Standby NN之間是通過一組JN共享數(shù)據(jù)(JN一般為奇數(shù)個,ZK一般也為奇數(shù)個),Active NN會把日志文件、鏡像文件寫到JN中去,只要JN中有一半寫成功,那就表明Active NN向JN中寫成功啦,Standby NN就開始從JN中讀取數(shù)據(jù),來實現(xiàn)與Active NN數(shù)據(jù)同步,這種方式支持容錯,因為Standby NN在啟動的時候,會加載鏡像文件(fsimage)并周期性的從JN中獲取日志文件來保持與Active NN同步
???? 為了實現(xiàn)Standby NN在Active NN掛掉之后,能迅速的再提供服務(wù),需要DN不僅需要向Active NN匯報,同時還要向Standby NN匯報,這樣就使得Standby NN能保存數(shù)據(jù)塊在DN上的位置信息,因為在NameNode在啟動過程中最費時工作,就是處理所有DN上的數(shù)據(jù)塊的信息
???? 為了實現(xiàn)Active NN高熱備,增加了FailoverController和ZK,FailoverController通過Heartbeat的方式與ZK通信,通過ZK來選舉,一旦Active NN掛掉,就選取另一個FailoverController作為active狀態(tài),然后FailoverController通過rpc,讓standby NN轉(zhuǎn)變?yōu)锳ctive NN
???? FailoverController一方面監(jiān)控NN的狀態(tài)信息,一方面還向ZK定時發(fā)送心跳,使自己被選舉。當自己被選為主(Active)的時候,就會通過rpc使相應(yīng)NN轉(zhuǎn)變Active狀態(tài)
3、結(jié)合HDFS2的新特性,在實際生成環(huán)境中部署圖
這里有12個DN,有4個NN,NN-1與NN-2是主備關(guān)系,它們管理/share目錄;NN-3與NN-4是主備關(guān)系,它們管理/user目錄
總結(jié)
以上是生活随笔為你收集整理的初步掌握HDFS的架构及原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins 自带环境变量
- 下一篇: Hadoop下载和源码阅读