1.HDFS性能介紹
HDFS(Hadoop Distributed File System)是一個(gè)分布式文件系統(tǒng)捍岳。它具有高容錯(cuò)性并提供了高吞吐量的數(shù)據(jù)訪問金踪,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用沪悲,它提供了一個(gè)高度容錯(cuò)性和高吞吐量的海量數(shù)據(jù)存儲(chǔ)解決方案。
1)高吞吐量訪問:HDFS的每個(gè)Block分布在不同的Rack上,在用戶訪問時(shí),HDFS會(huì)計(jì)算使用最近和訪問量最小的服務(wù)器給用戶提供塘秦。由于Block在不同的Rack上都有備份,所以不再是單數(shù)據(jù)訪問动看,所以速度和效率是非匙鹛蓿快的。另外HDFS可以并行從服務(wù)器集群中讀寫菱皆,增加了文件讀寫的訪問帶寬须误。
2)高容錯(cuò)性:系統(tǒng)故障是不可避免的,如何做到故障之后的數(shù)據(jù)恢復(fù)和容錯(cuò)處理是至關(guān)重要的仇轻。HDFS通過多方面保證數(shù)據(jù)的可靠性京痢,多份復(fù)制并且分布到物理位置的不同服務(wù)器上飞崖,數(shù)據(jù)校驗(yàn)功能生闲、后臺(tái)的連續(xù)自檢數(shù)據(jù)一致性功能都為高容錯(cuò)提供了可能眯漩。
3)線性擴(kuò)展:因?yàn)镠DFS的Block信息存放到NameNode上狐史,文件的Block分布到DataNode上,當(dāng)擴(kuò)充的時(shí)候僅僅添加DataNode數(shù)量默刚,系統(tǒng)可以在不停止服務(wù)的情況下做擴(kuò)充圾结,不需要人工干預(yù)脉幢。
2.hadoop主從結(jié)構(gòu)圖
如上圖所示HDFS是Master和Slave的結(jié)構(gòu)鸭轮,分為NameNode臣淤、Secondary NameNode和DataNode三種角色橄霉。
1)NameNode:在Hadoop1.X中只有一個(gè)Master節(jié)點(diǎn)窃爷,管理HDFS的名稱空間和數(shù)據(jù)塊映射信息、配置副本策略和處理客戶端請(qǐng)求姓蜂;
2)Secondary NameNode:輔助NameNode按厘,分擔(dān)NameNode工作,定期合并fsimage和fsedits并推送給NameNode钱慢,緊急情況下可輔助恢復(fù)NameNode逮京;
3)DataNode:Slave節(jié)點(diǎn),實(shí)際存儲(chǔ)數(shù)據(jù)束莫、執(zhí)行數(shù)據(jù)塊的讀寫并匯報(bào)存儲(chǔ)信息給NameNode懒棉;
3.HDFS讀操作流程圖詳解
1)客戶端通過調(diào)用FileSystem對(duì)象的open()方法來打開希望讀取的文件,對(duì)于HDFS來說览绿,這個(gè)對(duì)象是分布文件系統(tǒng)的一個(gè)實(shí)例策严;
2)DistributedFileSystem通過使用RPC來調(diào)用NameNode以確定文件起始?jí)K的位置,同一Block按照重復(fù)數(shù)會(huì)返回多個(gè)位置饿敲,這些位置按照Hadoop集群拓?fù)浣Y(jié)構(gòu)排序妻导,距離客戶端近的排在前面;
3)前兩步會(huì)返回一個(gè)FSDataInputStream對(duì)象,該對(duì)象會(huì)被封裝成DFSInputStream對(duì)象倔韭,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流术浪,客戶端對(duì)這個(gè)輸入流調(diào)用read()方法;
4)存儲(chǔ)著文件起始?jí)K的DataNode地址的DFSInputStream隨即連接距離最近的DataNode寿酌,通過對(duì)數(shù)據(jù)流反復(fù)調(diào)用read()方法胰苏,可以將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳耍?/p>
5)到達(dá)塊的末端時(shí),DFSInputStream會(huì)關(guān)閉與該DataNode的連接醇疼,然后尋找下一個(gè)塊的最佳DataNode碟联,這些操作對(duì)客戶端來說是透明的,客戶端的角度看來只是讀一個(gè)持續(xù)不斷的流僵腺;
6)一旦客戶端完成讀取鲤孵,就對(duì)FSDataInputStream調(diào)用close()方法關(guān)閉文件讀取。
4.HDFS寫操作流程圖詳解
1)客戶端通過調(diào)用DistributedFileSystem的create()方法創(chuàng)建新文件辰如;
2)DistributedFileSystem通過RPC調(diào)用NameNode去創(chuàng)建一個(gè)沒有Blocks關(guān)聯(lián)的新文件普监,創(chuàng)建前NameNode會(huì)做各種校驗(yàn),比如文件是否存在琉兜、客戶端有無權(quán)限去創(chuàng)建等凯正。如果校驗(yàn)通過,NameNode會(huì)為創(chuàng)建新文件記錄一條記錄豌蟋,否則就會(huì)拋出IO異常廊散;
3)前兩步結(jié)束后會(huì)返回FSDataOutputStream的對(duì)象,和讀文件的時(shí)候相似梧疲,F(xiàn)SDataOutputStream被封裝成DFSOutputStream允睹,DFSOutputStream可以協(xié)調(diào)NameNode和Datanode』系客戶端開始寫數(shù)據(jù)到DFSOutputStream缭受,DFSOutputStream會(huì)把數(shù)據(jù)切成一個(gè)個(gè)小的數(shù)據(jù)包,并寫入內(nèi)部隊(duì)列稱為“數(shù)據(jù)隊(duì)列”(Data Queue)该互;
4)DataStreamer會(huì)去處理接受Data Queue米者,它先問詢NameNode這個(gè)新的Block最適合存儲(chǔ)的在哪幾個(gè)DataNode里,比如重復(fù)數(shù)是3宇智,那么就找到3個(gè)最適合的DataNode蔓搞,把他們排成一個(gè)pipeline.DataStreamer把Packet按隊(duì)列輸出到管道的第一個(gè)Datanode中,第一個(gè)DataNode又把Packet輸出到第二個(gè)DataNode中随橘,以此類推喂分;
5)DFSOutputStream還有一個(gè)對(duì)列叫Ack Quene,也是有Packet組成太防,等待DataNode的收到響應(yīng)妻顶,當(dāng)Pipeline中的所有DataNode都表示已經(jīng)收到的時(shí)候酸员,這時(shí)Akc Quene才會(huì)把對(duì)應(yīng)的Packet包移除掉;
6)客戶端完成寫數(shù)據(jù)后調(diào)用close()方法關(guān)閉寫入流讳嘱;
7)DataStreamer把剩余的包都刷到Pipeline里然后等待Ack信息幔嗦,收到最后一個(gè)Ack后,通知NameNode把文件標(biāo)示為已完成沥潭。
5.HDFS中常用到的命令
#查看hdfs上的目錄結(jié)構(gòu)
hadoop fs -ls /? ??
# 遞歸查看hdfs上的目錄結(jié)構(gòu)? ? ? ? ? ?
hadoop fs -lsr
#在hdfs上創(chuàng)建目錄
hadoop fs -mkdir /user/hadoop
#將本地文件上傳到hdfs邀泉,保留本地文件:
hadoop fs -put a.txt /user/hadoop/
#將文件從HDFS下載到本地文件系統(tǒng)
hadoop fs -get /user/hadoop/a.txt /
#復(fù)制hdfs中的src為dst
hadoop fs -cp src dst
##移動(dòng)/改名hdfs中的src為dst
hadoop fs -mv src dst
#查看hdfs上文件a.txt的內(nèi)容
hadoop fs -cat /user/hadoop/a.txt
#刪除目錄下的文件
hadoop fs -rm /user/hadoop/a.txt
#刪除目錄
hadoop fs -rmr /user/hadoop/a
#為了避免誤刪數(shù)據(jù),加了一個(gè)確認(rèn)
hadoop fs -rmi /user/hadoop/a.txt
#將源文件輸出為文本格式钝鸽。允許的格式是zip和TextRecordInputStream
hadoop fs -text /user/hadoop/a.txt
#將本地文件上傳到hdfs汇恤,保留本地文件:
hadoop fs -copyFromLocal localsrc dst 與hadoop fs -put功能類似。
#將本地文件上傳到hdfs拔恰,同時(shí)刪除本地文件:
hadoop fs -moveFromLocal localsrc dst? ??
#顯示目錄中所有文件大小因谎,或者指定一個(gè)文件時(shí),顯示此文件大小
hadoop fs -du??/user/hadoop/a.txt
#計(jì)數(shù)文件個(gè)數(shù)及所占空間的詳情
hadoop fs -count? /
5.1HDFS中常用到的命令
# 報(bào)告文件系統(tǒng)的基本信息和統(tǒng)計(jì)信息?
hadoop dfsadmin -report?
hadoop dfsadmin -safemode enter | leave | get | wait
# 安全模式維護(hù)命令颜懊。安全模式是 Namenode 的一個(gè)狀態(tài)财岔,這種狀態(tài)下,Namenode??
# 1. 不接受對(duì)名字空間的更改(只讀)?
# 2. 不復(fù)制或刪除塊?
# Namenode 會(huì)在啟動(dòng)時(shí)自動(dòng)進(jìn)入安全模式河爹,當(dāng)配置的塊最小百分比數(shù)滿足最小的副本數(shù)條件時(shí)匠璧,會(huì)自動(dòng)離開安全模式。安全模式可以手動(dòng)進(jìn)入咸这,但是這樣的話也必須手動(dòng)關(guān)閉安全模式夷恍。
5.2HDFS中常用到的命令
#運(yùn)行 HDFS 文件系統(tǒng)檢查工具
hadoop fsck