HDFS基本原理
HDFS針對(duì)的使用場(chǎng)景是數(shù)據(jù)讀寫具有“一次寫,多次讀”的特征。HDFS保證一個(gè)文件在一個(gè)時(shí)刻只被一個(gè)調(diào)用者執(zhí)行寫操作,而可以被多個(gè)調(diào)用者執(zhí)行讀操作。
HDFS結(jié)構(gòu)
HDFS是一個(gè)Master/Slave的架構(gòu),在Master上運(yùn)行NameNode,而在每一個(gè)Slave上運(yùn)行DataNode,ZKFC需要和NameNode一起運(yùn)行。
- 各模塊的功能說明如下所示:
NameNode
用于管理文件系統(tǒng)的命名空間、目錄結(jié)構(gòu)、元數(shù)據(jù)信息以及提供備份機(jī)制等,分為
Active NameNode、Standby NameNode、Observer NameNode。
DataNode
用于存儲(chǔ)每個(gè)文件的“數(shù)據(jù)塊”數(shù)據(jù),并且會(huì)周期性地向NameNode報(bào)告該DataNode的數(shù)據(jù)存放情況。
JournalNode
HA集群下,用于同步主備NameNode之間的元數(shù)據(jù)信息。
ZKFC
ZKFC是需要和NameNode一一對(duì)應(yīng)的服務(wù),即每個(gè)NameNode都需要部署ZKFC。它負(fù)責(zé)監(jiān)控NameNode的狀態(tài),并及時(shí)把狀態(tài)寫入ZooKeeper。ZKFC也有選擇誰作為Active NameNode的權(quán)利。
ZK Cluster
ZooKeeper是一個(gè)協(xié)調(diào)服務(wù),幫助ZKFC執(zhí)行主NameNode的選舉。
HttpFS gateway
HttpFS是個(gè)單獨(dú)無狀態(tài)的gateway進(jìn)程,對(duì)外提供webHDFS接口,對(duì)HDFS使用FileSystem接口對(duì)接??捎糜诓煌琀adoop版本間的數(shù)據(jù)傳輸,及用于訪問在防火墻后的HDFS(HttpFS用作gateway)。

HDFS HA架構(gòu)
HA即為High Availability,用于解決NameNode單點(diǎn)故障問題,該特性通過主備的方式為主NameNode提供一個(gè)備用者,一旦主NameNode出現(xiàn)故障,可以迅速切換至備NameNode,從而不間斷對(duì)外提供服務(wù)。
- HA架構(gòu)介紹
在一個(gè)典型HDFS HA場(chǎng)景中,通常由兩個(gè)NameNode組成,一個(gè)處于Active狀態(tài),另一個(gè)處于Standby狀態(tài)。
為了能實(shí)現(xiàn)Active和Standby兩個(gè)NameNode的元數(shù)據(jù)信息同步,需提供一個(gè)共享存儲(chǔ)系統(tǒng)。本版本提供基于QJM(Quorum Journal Manager)的HA解決方案,如圖2所示。主備NameNode之間通過一組JournalNode同步元數(shù)據(jù)信息。
通常配置奇數(shù)個(gè)(2N+1個(gè))JournalNode,且最少要運(yùn)行3個(gè)JournalNode。這樣,一條元數(shù)據(jù)更新消息只要有N+1個(gè)JournalNode寫入成功就認(rèn)為數(shù)據(jù)寫入成功,此時(shí)最多容忍N(yùn)個(gè)JournalNode寫入失敗。比如,3個(gè)JournalNode時(shí),最多允許1個(gè)JournalNode寫入失敗,5個(gè)JournalNode時(shí),最多允許2個(gè)JournalNode寫入失敗。
由于JournalNode是一個(gè)輕量級(jí)的守護(hù)進(jìn)程,可以與Hadoop其它服務(wù)共用機(jī)器。建議將JournalNode部署在控制節(jié)點(diǎn)上,以避免數(shù)據(jù)節(jié)點(diǎn)在進(jìn)行大數(shù)據(jù)量傳輸時(shí)引起JournalNode寫入失敗。

HDFS原理
MRS使用HDFS的副本機(jī)制來保證數(shù)據(jù)的可靠性,HDFS中每保存一個(gè)文件則自動(dòng)生成1個(gè)備份文件,即共2個(gè)副本。HDFS副本數(shù)可通過“dfs.replication”參數(shù)查詢。
- Core節(jié)點(diǎn)與HDFS默認(rèn)副本的關(guān)系:
當(dāng)MRS集群中Core節(jié)點(diǎn)規(guī)格選擇為非本地盤(hdd)時(shí),若集群中只有一個(gè)Core節(jié)點(diǎn),則HDFS默認(rèn)副本數(shù)為1。若集群中Core節(jié)點(diǎn)數(shù)大于等于2,則HDFS默認(rèn)副本數(shù)為2。
當(dāng)MRS集群中Core節(jié)點(diǎn)規(guī)格選擇為本地盤(hdd)時(shí),若集群中只有一個(gè)Core節(jié)點(diǎn),則HDFS默認(rèn)副本數(shù)為1。若集群中有兩個(gè)Core節(jié)點(diǎn),則HDFS默認(rèn)副本數(shù)為2。若集群中Core節(jié)點(diǎn)數(shù)大于等于3,則HDFS默認(rèn)副本數(shù)為3。
- MRS服務(wù)的HDFS組件支持以下部分特性:
HDFS組件支持糾刪碼,使得數(shù)據(jù)冗余減少到50%,且可靠性更高,并引入條帶化的塊存儲(chǔ)結(jié)構(gòu),最大化的利用現(xiàn)有集群?jiǎn)喂?jié)點(diǎn)多磁盤的能力,使得數(shù)據(jù)寫入性能在引入編碼過程后,仍和原來多副本冗余的性能接近。
支持HDFS組件上節(jié)點(diǎn)均衡調(diào)度和單節(jié)點(diǎn)內(nèi)的磁盤均衡調(diào)度,有助于擴(kuò)容節(jié)點(diǎn)或擴(kuò)容磁盤后的HDFS存儲(chǔ)性能提升。

HDFS與其他組件的關(guān)系
-
HDFS和HBase的關(guān)系
HDFS是Apache的Hadoop項(xiàng)目的子項(xiàng)目,HBase利用Hadoop HDFS作為其文件存儲(chǔ)系統(tǒng)。HBase位于結(jié)構(gòu)化存儲(chǔ)層,Hadoop HDFS為HBase提供了高可靠性的底層存儲(chǔ)支持。除了HBase產(chǎn)生的一些日志文件,HBase中的所有數(shù)據(jù)文件都可以存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上。
HDFS是Apache的Hadoop項(xiàng)目的子項(xiàng)目,HBase利用Hadoop HDFS作為其文件存儲(chǔ)系統(tǒng)。HBase位于結(jié)構(gòu)化存儲(chǔ)層,Hadoop HDFS為HBase提供了高可靠性的底層存儲(chǔ)支持。除了HBase產(chǎn)生的一些日志文件,HBase中的所有數(shù)據(jù)文件都可以存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上。
-
HDFS和MapReduce的關(guān)系
HDFS是Hadoop分布式文件系統(tǒng),具有高容錯(cuò)和高吞吐量的特性,可以部署在價(jià)格低廉的硬件上,存儲(chǔ)應(yīng)用程序的數(shù)據(jù),適合有超大數(shù)據(jù)集的應(yīng)用程序。
而MapReduce是一種編程模型,用于大數(shù)據(jù)集(大于1TB)的并行運(yùn)算。在MapReduce程序中計(jì)算的數(shù)據(jù)可以來自多個(gè)數(shù)據(jù)源,如Local FileSystem、HDFS、數(shù)據(jù)庫等。最常用的是HDFS,可以利用HDFS的高吞吐性能讀取大規(guī)模的數(shù)據(jù)進(jìn)行計(jì)算。同時(shí)在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
HDFS是Hadoop分布式文件系統(tǒng),具有高容錯(cuò)和高吞吐量的特性,可以部署在價(jià)格低廉的硬件上,存儲(chǔ)應(yīng)用程序的數(shù)據(jù),適合有超大數(shù)據(jù)集的應(yīng)用程序。
而MapReduce是一種編程模型,用于大數(shù)據(jù)集(大于1TB)的并行運(yùn)算。在MapReduce程序中計(jì)算的數(shù)據(jù)可以來自多個(gè)數(shù)據(jù)源,如Local FileSystem、HDFS、數(shù)據(jù)庫等。最常用的是HDFS,可以利用HDFS的高吞吐性能讀取大規(guī)模的數(shù)據(jù)進(jìn)行計(jì)算。同時(shí)在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
-
HDFS和Spark的關(guān)系
通常,Spark中計(jì)算的數(shù)據(jù)可以來自多個(gè)數(shù)據(jù)源,如Local File、HDFS等。最常用的是HDFS,用戶可以一次讀取大規(guī)模的數(shù)據(jù)進(jìn)行并行計(jì)算。在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
分解來看,Spark分成控制端(Driver)和執(zhí)行端(Executor)??刂贫素?fù)責(zé)任務(wù)調(diào)度,執(zhí)行端負(fù)責(zé)任務(wù)執(zhí)行。
通常,Spark中計(jì)算的數(shù)據(jù)可以來自多個(gè)數(shù)據(jù)源,如Local File、HDFS等。最常用的是HDFS,用戶可以一次讀取大規(guī)模的數(shù)據(jù)進(jìn)行并行計(jì)算。在計(jì)算完成后,也可以將數(shù)據(jù)存儲(chǔ)到HDFS。
分解來看,Spark分成控制端(Driver)和執(zhí)行端(Executor)??刂贫素?fù)責(zé)任務(wù)調(diào)度,執(zhí)行端負(fù)責(zé)任務(wù)執(zhí)行。
-
HDFS和ZooKeeper的關(guān)系
ZKFC(ZKFailoverController)作為一個(gè)ZooKeeper集群的客戶端,用來監(jiān)控NameNode的狀態(tài)信息。ZKFC進(jìn)程僅在部署了NameNode的節(jié)點(diǎn)中存在。HDFS NameNode的Active和Standby節(jié)點(diǎn)均部署有zkfc進(jìn)程。
1.HDFS NameNode的ZKFC連接到ZooKeeper,把主機(jī)名等信息保存到ZooKeeper中,即“/hadoop-ha”下的znode目錄里。先創(chuàng)建znode目錄的NameNode節(jié)點(diǎn)為主節(jié)點(diǎn),另一個(gè)為備節(jié)點(diǎn)。HDFS NameNode Standby通過ZooKeeper定時(shí)讀取NameNode信息。
2.當(dāng)主節(jié)點(diǎn)進(jìn)程異常結(jié)束時(shí),HDFS NameNode Standby通過ZooKeeper感知“/hadoop-ha”目錄下發(fā)生了變化,NameNode會(huì)進(jìn)行主備切換。
ZKFC(ZKFailoverController)作為一個(gè)ZooKeeper集群的客戶端,用來監(jiān)控NameNode的狀態(tài)信息。ZKFC進(jìn)程僅在部署了NameNode的節(jié)點(diǎn)中存在。HDFS NameNode的Active和Standby節(jié)點(diǎn)均部署有zkfc進(jìn)程。
1.HDFS NameNode的ZKFC連接到ZooKeeper,把主機(jī)名等信息保存到ZooKeeper中,即“/hadoop-ha”下的znode目錄里。先創(chuàng)建znode目錄的NameNode節(jié)點(diǎn)為主節(jié)點(diǎn),另一個(gè)為備節(jié)點(diǎn)。HDFS NameNode Standby通過ZooKeeper定時(shí)讀取NameNode信息。
2.當(dāng)主節(jié)點(diǎn)進(jìn)程異常結(jié)束時(shí),HDFS NameNode Standby通過ZooKeeper感知“/hadoop-ha”目錄下發(fā)生了變化,NameNode會(huì)進(jìn)行主備切換。