HDFS:(Hadoop Distributed File System )分布式文件處理系統(tǒng)躯嫉,Hadoop生態(tài)體系的核心功能之一颈娜,主要用于數(shù)據(jù)文件的分割處理及存儲等季春。
HDFS的特點:
1潮改、高容錯性
? ? ?數(shù)據(jù)自動保存多個副本。它通過增加副本的形式亚茬,提高容錯性。
? ? ?某一個副本丟失以后浓恳,它可以自動恢復(fù)刹缝,這是由 HDFS 內(nèi)部機制實現(xiàn)的碗暗,我們不必關(guān)心。
2梢夯、適合批處理
? ? ?它是通過移動計算而不是移動數(shù)據(jù)言疗,移動計算比移動數(shù)據(jù)更劃算:核心思路是,大數(shù)據(jù)文件的移動考慮到颂砸,網(wǎng)絡(luò)帶寬噪奄,,傳輸速度人乓,存儲設(shè)備等因素成本非常高勤篮,既然數(shù)據(jù)是龐大的,而程序要比數(shù)據(jù)小得多色罚,將數(shù)據(jù)輸入給程序是不劃算的碰缔,那么就反其道而行之,將程序分發(fā)到數(shù)據(jù)所在的地方進行計算戳护,也就是所謂的移動計算比移動數(shù)據(jù)更劃算金抡。
? ? ?它會把數(shù)據(jù)位置暴露給計算框架。
3姑尺、適合大數(shù)據(jù)處理
? ? ?處理數(shù)據(jù)達到 GB竟终、TB、甚至PB級別的數(shù)據(jù)切蟋。
? ? ?能夠處理百萬規(guī)模以上的文件數(shù)量统捶,數(shù)量相當(dāng)之大。
? ? ?能夠處理10K節(jié)點的規(guī)模柄粹。
4喘鸟、流式文件訪問
? ? ?一次寫入,多次讀取驻右。文件一旦寫入不能修改什黑,只能追加。
? ? ?它能保證數(shù)據(jù)的一致性堪夭。
5愕把、可構(gòu)建在廉價機器上
? ? ?它通過多副本機制,提高可靠性森爽。
? ? ?它提供了容錯和恢復(fù)機制恨豁。比如某一個副本丟失,可以通過其它副本來恢復(fù)爬迟。
當(dāng)然 HDFS 也有它的劣勢橘蜜,并不適合所有的場合:
1、低延時數(shù)據(jù)訪問
? ? ?比如毫秒級的來存儲數(shù)據(jù)付呕,這是不行的计福,它做不到跌捆。
? ? ?它適合高吞吐率的場景,就是在某一時間內(nèi)寫入大量的數(shù)據(jù)象颖。但是它在低延時的情況下是不行的佩厚,比如毫秒級以內(nèi)讀取數(shù)據(jù),這樣它是很難做到的力麸。
2可款、小文件存儲
? ? ?存儲大量小文件(這里的小文件是指小于HDFS系統(tǒng)的Block大小的文件(默認64M))的話,它會占用 NameNode大量的內(nèi)存來存儲文件克蚂、目錄和塊信息闺鲸。這樣是不可取的,因為NameNode的內(nèi)存總是有限的埃叭。
? ? ?小文件存儲的尋道時間會超過讀取時間摸恍,它違反了HDFS的設(shè)計目標(biāo)。
3赤屋、并發(fā)寫入立镶、文件隨機修改
? ? ?一個文件只能有一個寫,不允許多個線程同時寫类早。
? ? ?僅支持?jǐn)?shù)據(jù) append(追加)媚媒,不支持文件的隨機修改。
HDFS的架構(gòu)模式:
HDFS采用主從架構(gòu)方式(master/slave)進行文件的存儲處理操作涩僻,通過Namenode作為主節(jié)點進行數(shù)據(jù)文件命名空間的管理缭召,Datanode數(shù)據(jù)節(jié)點進行數(shù)據(jù)塊的存儲。
HDFS 架構(gòu)主要由四個部分組成逆日,分別為HDFS Client嵌巷、NameNode、DataNode和Secondary NameNode室抽。
1搪哪、Client:就是客戶端。??
? ? ?文件切分坪圾。文件上傳 HDFS 的時候晓折,Client 將文件切分成 一個一個的Block,然后進行存儲兽泄。
? ? ?與 NameNode 交互已维,獲取文件的位置信息。
? ? ?與 DataNode 交互已日,讀取或者寫入數(shù)據(jù)。
? ? ?Client 提供一些命令來管理 HDFS栅屏,比如啟動或者關(guān)閉HDFS飘千。
? ? ?Client 可以通過一些命令來訪問 HDFS堂鲜。
2、NameNode:就是 master护奈,它是一個主管缔莲、管理者。
? ? ?管理 HDFS 的名稱空間
? ? ?管理數(shù)據(jù)塊(Block)映射信息
? ? ?配置副本策略
? ? ?處理客戶端讀寫請求霉旗。
3痴奏、DataNode:就是Slave。NameNode 下達命令厌秒,DataNode 執(zhí)行實際的操作读拆。
? ? ?存儲實際的數(shù)據(jù)塊。
? ? ?執(zhí)行數(shù)據(jù)塊的讀/寫操作鸵闪。
4檐晕、Secondary NameNode:并非 NameNode 的熱備。當(dāng)NameNode 掛掉的時候蚌讼,它并不能馬上替換 NameNode 并提供服務(wù)辟灰。
? ? ?輔助 NameNode,分擔(dān)其工作量篡石。
? ? ?定期合并 fsimage和fsedits芥喇,并推送給NameNode。
? ? ?在緊急情況下凰萨,可輔助恢復(fù) NameNode继控。
HDFS 如何讀取文件:
HDFS的文件讀取原理,主要包括以下幾個步驟:
首先調(diào)用FileSystem對象的open方法沟蔑,其實獲取的是一個DistributedFileSystem的實例湿诊。
DistributedFileSystem通過RPC(遠程過程調(diào)用)獲得文件的第一批block的locations,同一block按照重復(fù)數(shù)會返回多個locations瘦材,這些locations按照hadoop拓撲結(jié)構(gòu)排序厅须,距離客戶端近的排在前面。
前兩步會返回一個FSDataInputStream對象食棕,該對象會被封裝成 DFSInputStream對象朗和,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流〔鞠客戶端調(diào)用read方法眶拉,DFSInputStream就會找出離客戶端最近的datanode并連接datanode。
數(shù)據(jù)從datanode源源不斷的流向客戶端憔儿。
如果第一個block塊的數(shù)據(jù)讀完了忆植,就會關(guān)閉指向第一個block塊的datanode連接,接著讀取下一個block塊。這些操作對客戶端來說是透明的朝刊,從客戶端的角度來看只是讀一個持續(xù)不斷的流耀里。
如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location拾氓,然后繼續(xù)讀冯挎,如果所有的block塊都讀完,這時就會關(guān)閉掉所有的流咙鞍。
HDFS 如何寫入文件:
HDFS的文件寫入原理房官,主要包括以下幾個步驟:
客戶端通過調(diào)用 DistributedFileSystem 的create方法,創(chuàng)建一個新的文件续滋。
DistributedFileSystem 通過 RPC(遠程過程調(diào)用)調(diào)用 NameNode翰守,去創(chuàng)建一個沒有blocks關(guān)聯(lián)的新文件。創(chuàng)建前吃粒,NameNode 會做各種校驗潦俺,比如文件是否存在,客戶端有無權(quán)限去創(chuàng)建等徐勃。如果校驗通過事示,NameNode 就會記錄下新文件,否則就會拋出IO異常僻肖。
前兩步結(jié)束后會返回 FSDataOutputStream 的對象肖爵,和讀文件的時候相似,F(xiàn)SDataOutputStream 被封裝成 DFSOutputStream臀脏,DFSOutputStream 可以協(xié)調(diào) NameNode和 DataNode劝堪。客戶端開始寫數(shù)據(jù)到DFSOutputStream,DFSOutputStream會把數(shù)據(jù)切成一個個小packet揉稚,然后排成隊列 data queue秒啦。
DataStreamer 會去處理接受 data queue,它先問詢 NameNode 這個新的 block 最適合存儲的在哪幾個DataNode里搀玖,比如重復(fù)數(shù)是3余境,那么就找到3個最適合的 DataNode,把它們排成一個 pipeline灌诅。DataStreamer 把 packet 按隊列輸出到管道的第一個 DataNode 中芳来,第一個 DataNode又把 packet 輸出到第二個 DataNode 中,以此類推猜拾。
DFSOutputStream 還有一個隊列叫 ack queue即舌,也是由 packet 組成,等待DataNode的收到響應(yīng)挎袜,當(dāng)pipeline中的所有DataNode都表示已經(jīng)收到的時候顽聂,這時akc queue才會把對應(yīng)的packet包移除掉肥惭。
客戶端完成寫數(shù)據(jù)后,調(diào)用close方法關(guān)閉寫入流芜飘。
DataStreamer 把剩余的包都刷到 pipeline 里务豺,然后等待 ack 信息,收到最后一個 ack 后嗦明,通知 DataNode 把文件標(biāo)示為已完成。