一、HDFS基本概念
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括于都網(wǎng)站建設(shè)、于都網(wǎng)站制作、于都網(wǎng)頁(yè)制作以及于都網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,于都網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到于都省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
HDFS全稱(chēng)是Hadoop Distributed System。HDFS是為以流的方式存取大文件而設(shè)計(jì)的。適用于幾百M(fèi)B,GB以及TB,并寫(xiě)一次讀多次的場(chǎng)合。而對(duì)于低延時(shí)數(shù)據(jù)訪問(wèn)、大量小文件、同時(shí)寫(xiě)和任意的文件修改,則并不是十分適合。
目前HDFS支持的使用接口除了Java的還有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS是以block-sized chunk組織其文件內(nèi)容的,默認(rèn)的block大小為64MB,對(duì)于不足64MB的文件,其會(huì)占用一個(gè)block,但實(shí)際上不用占用實(shí)際硬盤(pán)上的64MB,這可以說(shuō)是HDFS是在文件系統(tǒng)之上架設(shè)的一個(gè)中間層。之所以將默認(rèn)的block大小設(shè)置為64MB這么大,是因?yàn)閎lock-sized對(duì)于文件定位很有幫助,同時(shí)大文件更使傳輸?shù)臅r(shí)間遠(yuǎn)大于文件尋找的時(shí)間,這樣可以最大化地減少文件定位的時(shí)間在整個(gè)文件獲取總時(shí)間中的比例。
二、HDFS設(shè)計(jì)原則
HDFS是Google的GFS(Google File System)的開(kāi)源實(shí)現(xiàn)。具有以下五個(gè)基本目標(biāo):
1、硬件錯(cuò)誤是常態(tài)而不是錯(cuò)誤。HDFS一般運(yùn)行在普通的硬件上,所以硬件錯(cuò)誤是一種很正常的情況。所以在HDFS中,錯(cuò)誤的檢測(cè)并快速自動(dòng)恢復(fù)是HDFS的最核心的設(shè)計(jì)目標(biāo)。
2、流式數(shù)據(jù)訪問(wèn)。運(yùn)行在HDFS上的應(yīng)用主要是以批量處理為主,而不是用戶(hù)交互式事務(wù),以流式數(shù)據(jù)讀取為多。
3、大規(guī)模數(shù)據(jù)集。HDFS中典型的文件大小要達(dá)到GB或者是TB級(jí)。
4、簡(jiǎn)單一致性原則。HDFS的應(yīng)用程序一般對(duì)文件的操作時(shí)一次寫(xiě)入、多次讀出的模式。文件一經(jīng)創(chuàng)建、寫(xiě)入、關(guān)閉后,一般文件內(nèi)容再發(fā)生改變。這種簡(jiǎn)單的一致性原則,使高吞吐量的數(shù)據(jù)訪問(wèn)成為可能。
5、數(shù)據(jù)就近原則。HDFS提供接口,以便應(yīng)用程序?qū)⒆陨淼膱?zhí)行代碼移動(dòng)到數(shù)據(jù)節(jié)點(diǎn)上來(lái)執(zhí)行。采用這種方式的原因主要是:移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更加劃算。相比與HDFS中的大數(shù)據(jù)/大文件,移動(dòng)計(jì)算的代碼相比與移動(dòng)數(shù)據(jù)更加劃算,采用這種方式可以提供寬帶的利用率,增加系統(tǒng)吞吐量,減少網(wǎng)絡(luò)的堵塞程度。
三、HDFS的體系結(jié)構(gòu)
構(gòu)成HDFS主要是Namenode(master)和一系列的Datanode(workers)。
Namenode是管理HDFS的目錄樹(shù)和相關(guān)的文件元數(shù)據(jù),這些信息是以"namespacep_w_picpath"和"edit log"兩個(gè)文件形式存放在本地磁盤(pán),但是這些文件是在HDFS每次重啟的時(shí)候重新構(gòu)造出來(lái)的。
Datanode則是存取文件實(shí)際內(nèi)容的節(jié)點(diǎn),Datanodes會(huì)定時(shí)地將block的列表匯報(bào)給Namenode。
由于Namenode是元數(shù)據(jù)存放的節(jié)點(diǎn),如果Namenode掛了那么HDFS就沒(méi)法正常運(yùn)行,因此一般使用將元數(shù)據(jù)持久存儲(chǔ)在本地或遠(yuǎn)程的機(jī)器上,或者使用secondary namenode來(lái)定期同步Namenode的元數(shù)據(jù)信息,secondary namenode有點(diǎn)類(lèi)似于MySQL的Master/Salves中的Slave,"edit log"就類(lèi)似"bin log"。如果Namenode出現(xiàn)了故障,一般會(huì)將原Namenode中持久化的元數(shù)據(jù)拷貝到secondary namenode中,使secondary namenode作為新的Namenode運(yùn)行起來(lái)。
HDFS是一個(gè)主從結(jié)構(gòu)(master/slave)。如圖所示:
四、HDFS可靠性保障措施
HDFS的主要設(shè)計(jì)目標(biāo)之一是在故障情況下,要保障數(shù)據(jù)存儲(chǔ)的可靠性。
HDFS具備了完善的冗余備份和故障恢復(fù)機(jī)制。一般通過(guò)dfs.replication設(shè)置備份份數(shù),默認(rèn)3。
1、冗余備份。將數(shù)據(jù)寫(xiě)入到多個(gè)DataNode節(jié)點(diǎn)上,當(dāng)其中某些節(jié)點(diǎn)宕機(jī)后,還可以從其他節(jié)點(diǎn)獲取數(shù)據(jù)并復(fù)制到其他節(jié)點(diǎn),使備份數(shù)達(dá)到設(shè)置值。dfs.replication設(shè)置備份數(shù)。
2、副本存放。HDFS采用機(jī)架感知(Rack-aware)的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)寬帶的利用率。當(dāng)復(fù)制因子為3時(shí),HDFS的副本存放策略是:第一個(gè)副本放到同一機(jī)架的另一個(gè)節(jié)點(diǎn)(執(zhí)行在集群中)/隨機(jī)一個(gè)節(jié)點(diǎn)(執(zhí)行在集群外)。第二個(gè)副本放到本地機(jī)架的其他任意節(jié)點(diǎn)。第三個(gè)副本放在其他機(jī)架的任意節(jié)點(diǎn)。這種策略可以防止整個(gè)機(jī)架失效時(shí)的數(shù)據(jù)丟失,也可以充分利用到機(jī)架內(nèi)的高寬帶特效。
3、心跳檢測(cè)。NameNode會(huì)周期性的從集群中的每一個(gè)DataNode上接收心跳包和塊報(bào)告,NameNode根據(jù)這些報(bào)告驗(yàn)證映射和其他文件系統(tǒng)元數(shù)據(jù)。當(dāng)NameNode沒(méi)法接收到DataNode節(jié)點(diǎn)的心跳報(bào)告后,NameNode會(huì)將該DataNode標(biāo)記為宕機(jī),NameNode不會(huì)再給該DataNode節(jié)點(diǎn)發(fā)送任何IO操作。同時(shí)DataNode的宕機(jī)也可能導(dǎo)致數(shù)據(jù)的復(fù)制。一般引發(fā)重新復(fù)制副本有多重原因:DataNode不可用、數(shù)據(jù)副本損壞、DataNode上的磁盤(pán)錯(cuò)誤或者復(fù)制因子增大。
4、安全模式。在HDFS系統(tǒng)的時(shí)候,會(huì)先經(jīng)過(guò)一個(gè)完全模式,在這個(gè)模式中,是不允許數(shù)據(jù)塊的寫(xiě)操作。NameNode會(huì)檢測(cè)DataNode上的數(shù)據(jù)塊副本數(shù)沒(méi)有達(dá)到最小副本數(shù),那么就會(huì)進(jìn)入完全模式,并開(kāi)始副本的復(fù)制,只有當(dāng)副本數(shù)大于最小副本數(shù)的時(shí)候,那么會(huì)自動(dòng)的離開(kāi)安全模式。DataNode節(jié)點(diǎn)有效比例:dfs.safemode.threshold.pct(默認(rèn)0.999f),所以說(shuō)當(dāng)DataNode節(jié)點(diǎn)丟失達(dá)到1-0.999f后,會(huì)進(jìn)入安全模式。
5、數(shù)據(jù)完整性檢測(cè)。HDFS實(shí)現(xiàn)了對(duì)HDFS文件內(nèi)容的校驗(yàn)和檢測(cè)(CRC循環(huán)校驗(yàn)碼),在寫(xiě)入數(shù)據(jù)文件的時(shí)候,也會(huì)將數(shù)據(jù)塊的校驗(yàn)和寫(xiě)入到一個(gè)隱藏文件中()。當(dāng)客戶(hù)端獲取文件后,它會(huì)檢查從DataNode節(jié)點(diǎn)獲取的數(shù)據(jù)庫(kù)對(duì)應(yīng)的校驗(yàn)和是否和隱藏文件中的校驗(yàn)和一致,如果不一致,那么客戶(hù)端就會(huì)認(rèn)為該數(shù)據(jù)庫(kù)有損壞,將從其他DataNode節(jié)點(diǎn)上獲取數(shù)據(jù)塊,并報(bào)告NameNode節(jié)點(diǎn)該DataNode節(jié)點(diǎn)的數(shù)據(jù)塊信息。
6、回收站。HDFS中刪除的文件先會(huì)保存到一個(gè)文件夾中(/trash),方便數(shù)據(jù)的恢復(fù)。當(dāng)刪除的時(shí)間超過(guò)設(shè)置的時(shí)間閥后(默認(rèn)6小時(shí)),HDFS會(huì)將數(shù)據(jù)塊徹底刪除。
7、映像文件和事務(wù)日志。這兩種數(shù)據(jù)是HDFS中的核心數(shù)據(jù)結(jié)構(gòu)。
8、快照。
五、數(shù)據(jù)存儲(chǔ)操作
1、數(shù)據(jù)存儲(chǔ): block
默認(rèn)數(shù)據(jù)塊大小為128MB,可配置。若文件大小不到128MB,則單獨(dú)存成一個(gè)block。
為何數(shù)據(jù)塊如此之大? 數(shù)據(jù)傳輸時(shí)間超過(guò)尋道時(shí)間(高吞吐率)
一個(gè)文件存儲(chǔ)方式? 按大小被切分成若干個(gè)block,存儲(chǔ)到不同節(jié)點(diǎn)上,默認(rèn)情況下每個(gè)block有三個(gè)副本。
2、數(shù)據(jù)存儲(chǔ): staging
HDFSclient上傳數(shù)據(jù)到HDFS時(shí),首先,在本地緩存數(shù)據(jù),當(dāng)數(shù)據(jù)達(dá)到一個(gè)block大小時(shí),請(qǐng)求NameNode分配一個(gè)block。 NameNode會(huì)把block所在的DataNode的地址告訴HDFS client。 HDFS client會(huì)直接和DataNode通信,把數(shù)據(jù)寫(xiě)到DataNode節(jié)點(diǎn)一個(gè)block文件中。
六、寫(xiě)入數(shù)據(jù)
1.初始化FileSystem,客戶(hù)端調(diào)用create()來(lái)創(chuàng)建文件。
2.FileSystem用RPC調(diào)用元數(shù)據(jù)節(jié)點(diǎn),在文件系統(tǒng)的命名空間中創(chuàng)建一個(gè)新的文件,元數(shù)據(jù)節(jié)點(diǎn)首先確定文件原來(lái)不存在,并且客戶(hù)端有創(chuàng)建文件的權(quán)限,然后創(chuàng)建新文件。
3.FileSystem返回DFSOutputStream,客戶(hù)端用于寫(xiě)數(shù)據(jù),客戶(hù)端開(kāi)始寫(xiě)入數(shù)據(jù)。
4.DFSOutputStream將數(shù)據(jù)分成塊,寫(xiě)入data queue。data queue由Data Streamer讀取,并通知元數(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里。Data Streamer將數(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)。
5.DFSOutputStream為發(fā)出去的數(shù)據(jù)塊保存了ack queue,等待pipeline中的數(shù)據(jù)節(jié)點(diǎn)告知數(shù)據(jù)已經(jīng)寫(xiě)入成功。
6.當(dāng)客戶(hù)端結(jié)束寫(xiě)入數(shù)據(jù),則調(diào)用stream的close函數(shù)。此操作將所有的數(shù)據(jù)塊寫(xiě)入pipeline中的數(shù)據(jù)節(jié)點(diǎn),并等待ack queue返回成功。最后通知元數(shù)據(jù)節(jié)點(diǎn)寫(xiě)入完畢。
7.如果數(shù)據(jù)節(jié)點(diǎn)在寫(xiě)入的過(guò)程中失敗,關(guān)閉pipeline,將ack queue中的數(shù)據(jù)塊放入data queue的開(kāi)始,當(dāng)前的數(shù)據(jù)塊在已經(jīng)寫(xiě)入的數(shù)據(jù)節(jié)點(diǎn)中被元數(shù)據(jù)節(jié)點(diǎn)賦予新的標(biāo)示,則錯(cuò)誤節(jié)點(diǎn)重啟后能夠察覺(jué)其數(shù)據(jù)塊是過(guò)時(shí)的,會(huì)被刪除。失敗的數(shù)據(jù)節(jié)點(diǎn)從pipeline中移除,另外的數(shù)據(jù)塊則寫(xiě)入pipeline中的另外兩個(gè)數(shù)據(jù)節(jié)點(diǎn)。元數(shù)據(jù)節(jié)點(diǎn)則被通知此數(shù)據(jù)塊是復(fù)制塊數(shù)不足,將來(lái)會(huì)再創(chuàng)建第三份備份。
8.如果在寫(xiě)的過(guò)程中某個(gè)datanode發(fā)生錯(cuò)誤,會(huì)采取以下幾步:
1)pipeline被關(guān)閉掉;
2)為了防止防止丟包ack quene里的packet會(huì)同步到data quene里;
3)把產(chǎn)生錯(cuò)誤的datanode上當(dāng)前在寫(xiě)但未完成的block刪掉;
4)block剩下的部分被寫(xiě)到剩下的兩個(gè)正常的datanode中;
5)namenode找到另外的datanode去創(chuàng)建這個(gè)塊的復(fù)制。當(dāng)然,這些操作對(duì)客戶(hù)端來(lái)說(shuō)是無(wú)感知的。
Java代碼
Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Path file = new Path("demo.txt"); FSDataOutputStream outStream =fs.create(file); outStream.writeUTF("Welcome to HDFSJava API!!!"); outStream.close();
寫(xiě)入過(guò)程圖片:
七、讀取過(guò)程
1.初始化FileSystem,然后客戶(hù)端(client)用FileSystem的open()函數(shù)打開(kāi)文件。
2.FileSystem用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)的地址。
3.FileSystem返回FSDataInputStream給客戶(hù)端,用來(lái)讀取數(shù)據(jù),客戶(hù)端調(diào)用stream的read()函數(shù)開(kāi)始讀取數(shù)據(jù)。
4.DFSInputStream連接保存此文件第一個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn),data從數(shù)據(jù)節(jié)點(diǎn)讀到客戶(hù)端(client)
5.當(dāng)此數(shù)據(jù)塊讀取完畢時(shí),DFSInputStream關(guān)閉和此數(shù)據(jù)節(jié)點(diǎn)的連接,然后連接此文件下一個(gè)數(shù)據(jù)塊的最近的數(shù)據(jù)節(jié)點(diǎn)。
6.當(dāng)客戶(hù)端讀取完畢數(shù)據(jù)的時(shí)候,調(diào)用FSDataInputStream的close函數(shù)。
7.在讀取數(shù)據(jù)的過(guò)程中,如果客戶(hù)端在與數(shù)據(jù)節(jié)點(diǎn)通信出現(xiàn)錯(cuò)誤,則嘗試連接包含此數(shù)據(jù)塊的下一個(gè)數(shù)據(jù)節(jié)點(diǎn)。
8.失敗的數(shù)據(jù)節(jié)點(diǎn)將被記錄,以后不再連接。
Java代碼
Configurationconf = new Configuration(); FileSystemfs = FileSystem.get(conf); Pathfile = new Path("demo.txt"); FSDataInputStreaminStream = fs.open(file); Stringdata = inStream.readUTF(); System.out.println(data); inStream.close();
讀取文件過(guò)程圖片:
當(dāng)前文章:Hadoop之HDFS讀寫(xiě)原理
本文來(lái)源:http://chinadenli.net/article2/iegooc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、虛擬主機(jī)、網(wǎng)站導(dǎo)航、搜索引擎優(yōu)化、、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)