分布式文件系統(tǒng)HDFS解讀
【前言】是蠻久木有寫(xiě)過(guò)關(guān)于hadoop的博客了額,雖然最近也看了一些關(guān)于linux的基礎(chǔ)知識(shí),但似乎把這個(gè)東西忘記了,其實(shí)時(shí)不時(shí)回顧一下以前的知識(shí)還是蠻有意思的,且行且憶!我們Hadoop主要由HDFS和MapReduce引擎兩部分組成。***部是HDFS,它存儲(chǔ)Hadoop集群中所有存儲(chǔ)節(jié)點(diǎn)上的文件。HDFS的上一層是MapReduce引擎,該引擎由JobTrackers和TaskTrackers組成。這篇博客就主要來(lái)講講HDFS吧~~~
HDFS是HadoopDistributedFileSystem的簡(jiǎn)稱(chēng),既然是分布式文件系統(tǒng),首先它必須是一個(gè)文件系統(tǒng),那么在Hadoop上面的文件系統(tǒng)會(huì)不會(huì)也像一般的文件系統(tǒng)一樣由目錄結(jié)構(gòu)和一組文件構(gòu)成呢?分布式是不是就是將文件分成幾部分分別存儲(chǔ)在不同的機(jī)器上呢?HDFS到底有什么優(yōu)點(diǎn)值得這么小題大作呢?
好吧,讓我們帶著疑問(wèn)一個(gè)個(gè)去探索吧!
一、HDFS基本概念
1、數(shù)據(jù)塊
HDFS默認(rèn)的最基本的存儲(chǔ)單位是64M的數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊可以理解和一般的文件里面的分塊是一樣的
2、元數(shù)據(jù)節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)
元數(shù)據(jù)節(jié)點(diǎn)(namenode)用來(lái)管理文件系統(tǒng)的命名空間,它將所有的文件和文件夾的元數(shù)據(jù)保存在一個(gè)文件系統(tǒng)樹(shù)中。
數(shù)據(jù)節(jié)點(diǎn)(datanode)就是用來(lái)存儲(chǔ)數(shù)據(jù)文件的。
從元數(shù)據(jù)節(jié)點(diǎn)(secondarynamenode)不是我們所想象的元數(shù)據(jù)節(jié)點(diǎn)的備用節(jié)點(diǎn),其實(shí)它主要的功能是主要功能就是周期性將元數(shù)據(jù)節(jié)點(diǎn)的命名空間鏡像文件和修改日志合并,以防日志文件過(guò)大。
這里先來(lái)弄清楚這個(gè)三種節(jié)點(diǎn)的關(guān)系吧!其實(shí)元數(shù)據(jù)節(jié)點(diǎn)上存儲(chǔ)的東西就相當(dāng)于一般文件系統(tǒng)中的目錄,也是有命名空間的映射文件以及修改的日志,只是分布式文件系統(tǒng)就將數(shù)據(jù)分布在各個(gè)機(jī)器上進(jìn)行存儲(chǔ)罷了,下面你看看這幾張說(shuō)明圖應(yīng)該就能明白了!
Namenode與secondarynamenode之間的進(jìn)行checkpoint的過(guò)程。
3、HDFS中的數(shù)據(jù)流
讀文件
客戶端(client)用FileSystem的open()函數(shù)打開(kāi)文件,DistributedFileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點(diǎn),得到文件的數(shù)據(jù)塊信息。對(duì)于每一個(gè)數(shù)據(jù)塊,元數(shù)據(jù)節(jié)點(diǎn)返回保存數(shù)據(jù)塊的數(shù)據(jù)節(jié)點(diǎn)的地址。DistributedFileSystem返回FSDataInputStream給客戶端,用來(lái)讀取數(shù)據(jù)??蛻舳苏{(diào)用stream的read()函數(shù)開(kāi)始讀取數(shù)據(jù)。DFSInputStream連接保存此文件***個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn)。Data從數(shù)據(jù)節(jié)點(diǎn)讀到客戶端(client),當(dāng)此數(shù)據(jù)塊讀取完畢時(shí),DFSInputStream關(guān)閉和此數(shù)據(jù)節(jié)點(diǎn)的連接,然后連接此文件下一個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn)。當(dāng)客戶端讀取完畢數(shù)據(jù)的時(shí)候,調(diào)用FSDataInputStream的close函數(shù)。
整個(gè)過(guò)程就是如圖所示:
寫(xiě)文件
客戶端調(diào)用create()來(lái)創(chuàng)建文件,DistributedFileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點(diǎn),在文件系統(tǒng)的命名空間中創(chuàng)建一個(gè)新的文件。元數(shù)據(jù)節(jié)點(diǎn)首先確定文件原來(lái)不存在,并且客戶端有創(chuàng)建文件的權(quán)限,然后創(chuàng)建新文件。DistributedFileSystem返回DFSOutputStream,客戶端用于寫(xiě)數(shù)據(jù)??蛻舳碎_(kāi)始寫(xiě)入數(shù)據(jù),DFSOutputStream將數(shù)據(jù)分成塊,寫(xiě)入dataqueue。Dataqueue由DataStreamer讀取,并通知元數(shù)據(jù)節(jié)點(diǎn)分配數(shù)據(jù)節(jié)點(diǎn),用來(lái)存儲(chǔ)數(shù)據(jù)塊(每塊默認(rèn)復(fù)制3塊)。分配的數(shù)據(jù)節(jié)點(diǎn)放在一個(gè)pipeline里。DataStreamer將數(shù)據(jù)塊寫(xiě)入pipeline中的***個(gè)數(shù)據(jù)節(jié)點(diǎn)。***個(gè)數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)塊發(fā)送給第二個(gè)數(shù)據(jù)節(jié)點(diǎn)。第二個(gè)數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)發(fā)送給第三個(gè)數(shù)據(jù)節(jié)點(diǎn)。DFSOutputStream為發(fā)出去的數(shù)據(jù)塊保存了ackqueue,等待pipeline中的數(shù)據(jù)節(jié)點(diǎn)告知數(shù)據(jù)已經(jīng)寫(xiě)入成功。如果數(shù)據(jù)節(jié)點(diǎn)在寫(xiě)入的過(guò)程中失敗:關(guān)閉pipeline,將ackqueue中的數(shù)據(jù)塊放入dataqueue的開(kāi)始。
整個(gè)過(guò)程如圖所示:
二、HDFS構(gòu)架與設(shè)計(jì)
Hadoop也是一個(gè)能夠分布式處理大規(guī)模海量數(shù)據(jù)的軟件框架,這一切都是在可靠、高效、可擴(kuò)展的基礎(chǔ)上。Hadoop的可靠性——因?yàn)镠adoop假設(shè)計(jì)算元素和存儲(chǔ)會(huì)出現(xiàn)故障,因?yàn)樗S護(hù)多個(gè)工作數(shù)據(jù)副本,在出現(xiàn)故障時(shí)可以對(duì)失敗的節(jié)點(diǎn)重新分布處理。Hadoop的高效性——在MapReduce的思想下,Hadoop是并行工作的,以加快任務(wù)處理速度。Hadoop的可擴(kuò)展——依賴于部署Hadoop軟件框架計(jì)算集群的規(guī)模,Hadoop的運(yùn)算是可擴(kuò)展的,具有處理PB級(jí)數(shù)據(jù)的能力。
Hadoop主要由HDFS(HadoopDistributedFileSystem)和MapReduce引擎兩部分組成。***部是HDFS,它存儲(chǔ)Hadoop集群中所有存儲(chǔ)節(jié)點(diǎn)上的文件。HDFS的上一層是MapReduce引擎,該引擎由JobTrackers和TaskTrackers組成。
HDFS可以執(zhí)行的操作有創(chuàng)建、刪除、移動(dòng)或重命名文件等,架構(gòu)類(lèi)似于傳統(tǒng)的分級(jí)文件系統(tǒng)。需要注意的是,HDFS的架構(gòu)基于一組特定的節(jié)點(diǎn)而構(gòu)建(參見(jiàn)圖2),這是它自身的特點(diǎn)。HDFS包括唯一的NameNode,它在HDFS內(nèi)部提供元數(shù)據(jù)服務(wù);DataNode為HDFS提供存儲(chǔ)塊。由于NameNode是唯一的,這也是HDFS的一個(gè)弱點(diǎn)(單點(diǎn)失敗)。一旦NameNode故障,后果可想而知。
1、HDFS構(gòu)架(如圖所示)
2、HDFS的設(shè)計(jì)
1)錯(cuò)誤檢測(cè)和快速、自動(dòng)的恢復(fù)是HDFS的核心架構(gòu)目標(biāo)。
2)比之關(guān)注數(shù)據(jù)訪問(wèn)的低延遲問(wèn)題,更關(guān)鍵的在于數(shù)據(jù)訪問(wèn)的高吞吐量。
3)HDFS應(yīng)用對(duì)文件要求的是write-one-read-many訪問(wèn)模型。
4)移動(dòng)計(jì)算的代價(jià)比之移動(dòng)數(shù)據(jù)的代價(jià)低。
3、文件系統(tǒng)的namespace
Namenode維護(hù)文件系統(tǒng)的namespace,一切對(duì)namespace和文件屬性進(jìn)行修改的都會(huì)被namenode記錄下來(lái),連文件副本的數(shù)目稱(chēng)為replication因子,這個(gè)也是由namenode記錄的。
4、數(shù)據(jù)復(fù)制
Namenode全權(quán)管理block的復(fù)制,它周期性地從集群中的每個(gè)Datanode接收心跳包和一個(gè)Blockreport。心跳包的接收表示該Datanode節(jié)點(diǎn)正常工作,而B(niǎo)lockreport包括了該Datanode上所有的block組成的列表。HDFS采用一種稱(chēng)為rack-aware的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、有效性和網(wǎng)絡(luò)帶寬的利用。完成對(duì)副本的存放。
5、文件系統(tǒng)元數(shù)據(jù)的持久化
Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)namespace和文件Blockmap的映像。這個(gè)關(guān)鍵的元數(shù)據(jù)設(shè)計(jì)得很緊湊,因而一個(gè)帶有4G內(nèi)存的Namenode足夠支撐海量的文件和目錄。當(dāng)Namenode啟動(dòng)時(shí),它從硬盤(pán)中讀取Editlog和FsImage,將所有Editlog中的事務(wù)作用(apply)在內(nèi)存中的FsImage,并將這個(gè)新版本的FsImage從內(nèi)存中flush到硬盤(pán)上,然后再truncate這個(gè)舊的Editlog,因?yàn)檫@個(gè)舊的Editlog的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程稱(chēng)為checkpoint。在當(dāng)前實(shí)現(xiàn)中,checkpoint只發(fā)生在Namenode啟動(dòng)時(shí),在不久的將來(lái)我們將實(shí)現(xiàn)支持周期性的checkpoint。
6、通信協(xié)議
所有的HDFS通訊協(xié)議都是構(gòu)建在TCP/IP協(xié)議上??蛻舳送ㄟ^(guò)一個(gè)可配置的端口連接到Namenode,通過(guò)ClientProtocol與Namenode交互。而Datanode是使用DatanodeProtocol與Namenode交互。從ClientProtocol和Datanodeprotocol抽象出一個(gè)遠(yuǎn)程調(diào)用(RPC),在設(shè)計(jì)上,Namenode不會(huì)主動(dòng)發(fā)起RPC,而是是響應(yīng)來(lái)自客戶端和Datanode的RPC請(qǐng)求。
HDFS不是這么簡(jiǎn)單就能說(shuō)清楚的,在以后的博客中我還會(huì)繼續(xù)研究hadoop的分布式文件系統(tǒng),包括HDFS的源碼分析等,現(xiàn)由于時(shí)間有限,暫時(shí)只做了以上一些簡(jiǎn)單的介紹吧,希望對(duì)大家由此對(duì)HDFS有一定的了解!