一、HDFS
HDFS全稱是Hadoop Distributed System。HDFS是為以流的方式存取大文件而設(shè)計(jì)的。適用于幾百M(fèi)B,GB以及TB,并寫一次讀多次的場合。而對于低延時數(shù)據(jù)訪問、大量小文件、同時寫和任意的文件修改,則并不是十分適合。
目前HDFS支持的使用接口除了Java的還有,Thrift、C、FUSE、WebDAV、HTTP等。HDFS是以block-sized chunk組織其文件內(nèi)容的,默認(rèn)的block大小為64MB,對于不足64MB的文件,其會占用一個block,但實(shí)際上不用占用實(shí)際硬盤上的64MB,這可以說是HDFS是在文件系統(tǒng)之上架設(shè)的一個中間層。之所以將默認(rèn)的block大小設(shè)置為64MB這么大,是因?yàn)閎lock-sized對于文件定位很有幫助,同時大文件更使傳輸?shù)臅r間遠(yuǎn)大于文件尋找的時間,這樣可以最大化地減少文件定位的時間在整個文件獲取總時間中的比例 。
二、HDFS的體系結(jié)構(gòu)
構(gòu)成HDFS主要是Namenode(master)和一系列的Datanode(workers)。Namenode是管理HDFS的目錄樹和相關(guān)的文件元數(shù)據(jù),這些信息是以"namespace image"和"edit log"兩個文件形式存放在本地磁盤,但是這些文件是在HDFS每次重啟的時候重新構(gòu)造出來的。Datanode則是存取文件實(shí)際內(nèi)容的節(jié)點(diǎn),Datanodes會定時地將block的列表匯報給Namenode。
由于Namenode是元數(shù)據(jù)存放的節(jié)點(diǎn),如果Namenode掛了那么HDFS就沒法正常運(yùn)行,因此一般使用將元數(shù)據(jù)持久存儲在本地或遠(yuǎn)程的機(jī)器上,或者使用secondary namenode來定期同步Namenode的元數(shù)據(jù)信息,secondary namenode有點(diǎn)類似于MySQL的Master/Salves中的Slave,"edit log"就類似"bin log"。如果Namenode出現(xiàn)了故障,一般會將原Namenode中持久化的元數(shù)據(jù)拷貝到secondary namenode中,使secondary namenode作為新的Namenode運(yùn)行起來。
???????????????????????????
三、讀寫流程
GFS論文提到的文件讀取簡單流程:
???????????????
?
詳細(xì)流程:
文件讀取的過程如下:
- 使用HDFS提供的客戶端開發(fā)庫Client,向遠(yuǎn)程的Namenode發(fā)起RPC請求;
- Namenode會視情況返回文件的部分或者全部block列表,對于每個block,Namenode都會返回有該block拷貝的DataNode地址;
- 客戶端開發(fā)庫Client會選取離客戶端最接近的DataNode來讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).
- 讀取完當(dāng)前block的數(shù)據(jù)后,關(guān)閉與當(dāng)前的DataNode連接,并為讀取下一個block尋找最佳的DataNode;
- 當(dāng)讀完列表的block后,且文件讀取還沒有結(jié)束,客戶端開發(fā)庫會繼續(xù)向Namenode獲取下一批的block列表。
- 讀取完一個block都會進(jìn)行checksum驗(yàn)證,如果讀取datanode時出現(xiàn)錯誤,客戶端會通知Namenode,然后再從下一個擁有該block拷貝的datanode繼續(xù)讀。
GFS論文提到的寫入文件簡單流程:
?????????????????????????????????????
? ? ? ? ?? ?
詳細(xì)流程:
寫入文件的過程比讀取較為復(fù)雜:
- 使用HDFS提供的客戶端開發(fā)庫Client,向遠(yuǎn)程的Namenode發(fā)起RPC請求;
- Namenode會檢查要創(chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會為文件 創(chuàng)建一個記錄 ,否則會讓客戶端拋出異常;
- 當(dāng)客戶端開始寫入文件的時候,開發(fā)庫會將文件切分成多個packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列"data queue"的形式管理這些packets,并向Namenode申請新的blocks,獲取用來存儲replicas的合適的datanodes列表,列表的大小根據(jù)在Namenode中對replication的設(shè)置而定。
- 開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發(fā)庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之后,再將其傳遞給在此pipeline中的下一個datanode,直到最后一個datanode,這種寫數(shù)據(jù)的方式呈流水線的形式。
- 最后一個datanode成功存儲之后會返回一個ack packet,在pipeline里傳遞至客戶端,在客戶端的開發(fā)庫內(nèi)部維護(hù)著"ack queue",成功收到datanode返回的ack packet后會從"ack queue"移除相應(yīng)的packet。
- 如果傳輸過程中,有某個datanode出現(xiàn)了故障,那么當(dāng)前的pipeline會被關(guān)閉,出現(xiàn)故障的datanode會從當(dāng)前的pipeline中移除,剩余的block會繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設(shè)定的數(shù)量。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

