公司網(wǎng)站建設(shè)有用嗎谷歌優(yōu)化seo
一、概述
HDFS是Hadoop的分布式文件系統(tǒng)(Hadoop Distributed File System),實(shí)現(xiàn)大規(guī)模數(shù)據(jù)可靠的分布式讀寫。HDFS針對的使用場景是數(shù)據(jù)讀寫具有“一次寫,多次讀”的特征,而數(shù)據(jù)“寫”操作是順序?qū)?#xff0c;也就是在文件創(chuàng)建時(shí)的寫入或者在現(xiàn)有文件之后的添加操作。HDFS保證一個(gè)文件在一個(gè)時(shí)刻只被一個(gè)調(diào)用者執(zhí)行寫操作,而可以被多個(gè)調(diào)用者執(zhí)行讀操作。
二、HDFS結(jié)構(gòu)
HDFS包含主、備NameNode和多個(gè)DataNode,如下圖所示。
HDFS是一個(gè)Master/Slave的架構(gòu),在Master上運(yùn)行NameNode,而在每一個(gè)Slave上運(yùn)行DataNode,ZKFC需要和NameNode一起運(yùn)行。
NameNode和DataNode之間的通信都是建立在TCP/IP的基礎(chǔ)之上的。NameNode、DataNode、ZKFC和JournalNode能部署在運(yùn)行Linux的服務(wù)器上。
名稱 | 描述 |
---|---|
NameNode | 用于管理文件系統(tǒng)的命名空間、目錄結(jié)構(gòu)、元數(shù)據(jù)信息以及提供備份機(jī)制等,分為:1. Active NameNode:管理文件系統(tǒng)的命名空間、維護(hù)文件系統(tǒng)的目錄結(jié)構(gòu)樹以及元數(shù)據(jù)信息;記錄寫入的每個(gè)“數(shù)據(jù)塊”與其歸屬文件的對應(yīng)關(guān)系。2. Standby NameNode:與Active NameNode中的數(shù)據(jù)保持同步;隨時(shí)準(zhǔn)備在Active NameNode出現(xiàn)異常時(shí)接管其服務(wù)。3.Observer NameNode:與Active NameNode中的數(shù)據(jù)保持同步,處理來自客戶端的讀請求。 |
DataNode | 用于存儲每個(gè)文件的“數(shù)據(jù)塊”數(shù)據(jù),并且會周期性地向NameNode報(bào)告該DataNode的數(shù)據(jù)存放情況。 |
JournalNode | HA集群下,用于同步主備NameNode之間的元數(shù)據(jù)信息。 |
ZKFC | ZKFC是需要和NameNode一一對應(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)程,對外提供webHDFS接口,對HDFS使用FileSystem接口對接??捎糜诓煌琀adoop版本間的數(shù)據(jù)傳輸,及用于訪問在防火墻后的HDFS(HttpFS用作gateway)。 |
HttpFS是個(gè)單獨(dú)無狀態(tài)的gateway進(jìn)程,對外提供webHDFS接口,對HDFS使用FileSystem接口對接??捎糜诓煌琀adoop版本間的數(shù)據(jù)傳輸,及用于訪問在防火墻后的HDFS(HttpFS用作gateway)。
三、HDFS原理
使用HDFS的副本機(jī)制來保證數(shù)據(jù)的可靠性,HDFS中每保存一個(gè)文件則自動生成1個(gè)備份文件,即共2個(gè)副本。HDFS副本數(shù)可通過“dfs.replication”參數(shù)查詢。
- 當(dāng)集群中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)集群中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。
HDFS組件支持以下部分特性:
- HDFS組件支持糾刪碼,使得數(shù)據(jù)冗余減少到50%,且可靠性更高,并引入條帶化的塊存儲結(jié)構(gòu),最大化的利用現(xià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存儲性能提升。
關(guān)于Hadoop的架構(gòu)和詳細(xì)原理介紹,請參見:http://hadoop.apache.org/。
四、HDFS HA方案背景
在Hadoop2.0.0之前,HDFS集群中存在單點(diǎn)故障問題。由于每個(gè)集群只有一個(gè)NameNode,如果NameNode所在機(jī)器發(fā)生故障,將導(dǎo)致HDFS集群無法使用,除非NameNode重啟或者在另一臺機(jī)器上啟動。這在兩個(gè)方面影響了HDFS的整體可用性:
- 當(dāng)異常情況發(fā)生時(shí),如機(jī)器崩潰,集群將不可用,除非重新啟動NameNode。
- 計(jì)劃性的維護(hù)工作,如軟硬件升級等,將導(dǎo)致集群停止工作。
針對以上問題,HDFS高可用性方案通過自動或手動(可配置)的方式,在一個(gè)集群中為NameNode啟動一個(gè)熱替換的NameNode備份。當(dāng)一臺機(jī)器故障時(shí),可以迅速地自動進(jìn)行NameNode主備切換。或者當(dāng)主NameNode節(jié)點(diǎn)需要進(jìn)行維護(hù)時(shí),通過集群管理員控制,可以手動進(jìn)行NameNode主備切換,從而保證集群在維護(hù)期間的可用性。
有關(guān)HDFS自動故障轉(zhuǎn)移功能,請參閱:
https://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoophdfs/HDFSHighAvailabilityWithQJM.html#Automatic_Failover
五、HDFS HA實(shí)現(xiàn)方案
在一個(gè)典型的HA集群中(如上圖所示),需要把兩個(gè)NameNodes配置在兩臺獨(dú)立的機(jī)器上。在任何一個(gè)時(shí)間點(diǎn),只有一個(gè)NameNode處于Active狀態(tài),另一個(gè)處于Standby狀態(tài)。Active節(jié)點(diǎn)負(fù)責(zé)處理所有客戶端操作,Standby節(jié)點(diǎn)時(shí)刻保持與Active節(jié)點(diǎn)同步的狀態(tài)以便在必要時(shí)進(jìn)行快速主備切換。
為保持Active和Standby節(jié)點(diǎn)的數(shù)據(jù)一致性,兩個(gè)節(jié)點(diǎn)都要與一組稱為JournalNode的節(jié)點(diǎn)通信。當(dāng)Active對文件系統(tǒng)元數(shù)據(jù)進(jìn)行修改時(shí),會將其修改日志保存到大多數(shù)的JournalNode節(jié)點(diǎn)中,例如有3個(gè)JournalNode,則日志會保存在至少2個(gè)節(jié)點(diǎn)中。Standby節(jié)點(diǎn)監(jiān)控JournalNodes的變化,并同步來自Active節(jié)點(diǎn)的修改。根據(jù)修改日志,Standby節(jié)點(diǎn)將變動應(yīng)用到本地文件系統(tǒng)元數(shù)據(jù)中。一旦發(fā)生故障轉(zhuǎn)移,Standby節(jié)點(diǎn)能夠確保與Active節(jié)點(diǎn)的狀態(tài)是一致的。這保證了文件系統(tǒng)元數(shù)據(jù)在故障轉(zhuǎn)移時(shí)在Active和Standby之間是完全同步的。
為保證故障轉(zhuǎn)移快速進(jìn)行,Standby需要時(shí)刻保持最新的塊信息,為此DataNodes同時(shí)向兩個(gè)NameNodes發(fā)送塊信息和心跳。
對一個(gè)HA集群,保證任何時(shí)刻只有一個(gè)NameNode是Active狀態(tài)至關(guān)重要。否則,命名空間會分為兩部分,有數(shù)據(jù)丟失和產(chǎn)生其他錯(cuò)誤的風(fēng)險(xiǎn)。為保證這個(gè)屬性,防止“split-brain”問題的產(chǎn)生,JournalNodes在任何時(shí)刻都只允許一個(gè)NameNode寫入。在故障轉(zhuǎn)移時(shí),將變?yōu)锳ctive狀態(tài)的NameNode獲得寫入JournalNodes的權(quán)限,這會有效防止其他NameNode的Active狀態(tài),使得切換安全進(jìn)行。
關(guān)于HDFS高可用性方案的更多信息,可參考如下鏈接:
https://hadoop.apache.org/docs/r3.3.1/hadoop-project-dist/hadoophdfs/HDFSHighAvailabilityWithQJM.html
六、HDFS和HBase的關(guān)系
HDFS是Apache的Hadoop項(xiàng)目的子項(xiàng)目,HBase利用Hadoop HDFS作為其文件存儲系統(tǒng)。HBase位于結(jié)構(gòu)化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持。除了HBase產(chǎn)生的一些日志文件,HBase中的所有數(shù)據(jù)文件都可以存儲在Hadoop HDFS文件系統(tǒng)上。
七、HDFS和MapReduce的關(guān)系
- HDFS是Hadoop分布式文件系統(tǒng),具有高容錯(cuò)和高吞吐量的特性,可以部署在價(jià)格低廉的硬件上,存儲應(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ù)存儲到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ù)存儲到HDFS。
分解來看,Spark分成控制端(Driver)和執(zhí)行端(Executor)。控制端負(fù)責(zé)任務(wù)調(diào)度,執(zhí)行端負(fù)責(zé)任務(wù)執(zhí)行。
讀取文件的過程如下圖所示。
讀取文件步驟的詳細(xì)描述如下所示:
- Driver與HDFS交互獲取File A的文件信息。
- HDFS返回該文件具體的Block信息。
- Driver根據(jù)具體的Block數(shù)據(jù)量,決定一個(gè)并行度,創(chuàng)建多個(gè)Task去讀取這些文件Block。
- 在Executor端執(zhí)行Task并讀取具體的Block,作為RDD(彈性分布數(shù)據(jù)集)的一部分。
寫入文件的過程如下圖所示。
HDFS文件寫入的詳細(xì)步驟如下所示:
- Driver創(chuàng)建要寫入文件的目錄。
- 根據(jù)RDD分區(qū)分塊情況,計(jì)算出寫數(shù)據(jù)的Task數(shù),并下發(fā)這些任務(wù)到Executor。
- Executor執(zhí)行這些Task,將具體RDD的數(shù)據(jù)寫入到步驟1創(chuàng)建的目錄下。
九、HDFS和ZooKeeper的關(guān)系
ZooKeeper與HDFS的關(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)程。
- 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信息。
- 當(dāng)主節(jié)點(diǎn)進(jìn)程異常結(jié)束時(shí),HDFS NameNode Standby通過ZooKeeper感知“/hadoop-ha”目錄下發(fā)生了變化,NameNode會進(jìn)行主備切換。