1.HDFS性能介紹
HDFS(Hadoop Distributed File System)是一個(gè)分布式文件系統(tǒng)。它具有高容錯(cuò)性并提供了高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用,它提供了一個(gè)高度容錯(cuò)性和高吞吐量的海量數(shù)據(jù)存儲解決方案。
1)高吞吐量訪問:HDFS的每個(gè)Block分布在不同的Rack上,在用戶訪問時(shí),HDFS會計(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)功能、后臺的連續(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ù)塊映射信息、配置副本策略和處理客戶端請求;
2)Secondary NameNode:輔助NameNode,分擔(dān)NameNode工作,定期合并fsimage和fsedits并推送給NameNode,緊急情況下可輔助恢復(fù)NameNode;
3)DataNode:Slave節(jié)點(diǎn),實(shí)際存儲數(shù)據(jù)、執(zhí)行數(shù)據(jù)塊的讀寫并匯報(bào)存儲信息給NameNode;
3.HDFS讀操作流程圖詳解

1)客戶端通過調(diào)用FileSystem對象的open()方法來打開希望讀取的文件,對于HDFS來說,這個(gè)對象是分布文件系統(tǒng)的一個(gè)實(shí)例;
2)DistributedFileSystem通過使用RPC來調(diào)用NameNode以確定文件起始塊的位置,同一Block按照重復(fù)數(shù)會返回多個(gè)位置,這些位置按照Hadoop集群拓?fù)浣Y(jié)構(gòu)排序,距離客戶端近的排在前面;
3)前兩步會返回一個(gè)FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流,客戶端對這個(gè)輸入流調(diào)用read()方法;
4)存儲著文件起始塊的DataNode地址的DFSInputStream隨即連接距離最近的DataNode,通過對數(shù)據(jù)流反復(fù)調(diào)用read()方法,可以將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳耍?/p>
5)到達(dá)塊的末端時(shí),DFSInputStream會關(guān)閉與該DataNode的連接,然后尋找下一個(gè)塊的最佳DataNode,這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個(gè)持續(xù)不斷的流;
6)一旦客戶端完成讀取,就對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會做各種校驗(yàn),比如文件是否存在、客戶端有無權(quán)限去創(chuàng)建等。如果校驗(yàn)通過,NameNode會為創(chuàng)建新文件記錄一條記錄,否則就會拋出IO異常;
3)前兩步結(jié)束后會返回FSDataOutputStream的對象,和讀文件的時(shí)候相似,F(xiàn)SDataOutputStream被封裝成DFSOutputStream,DFSOutputStream可以協(xié)調(diào)NameNode和Datanode??蛻舳碎_始寫數(shù)據(jù)到DFSOutputStream,DFSOutputStream會把數(shù)據(jù)切成一個(gè)個(gè)小的數(shù)據(jù)包,并寫入內(nèi)部隊(duì)列稱為“數(shù)據(jù)隊(duì)列”(Data Queue);
4)DataStreamer會去處理接受Data Queue,它先問詢NameNode這個(gè)新的Block最適合存儲的在哪幾個(gè)DataNode里,比如重復(fù)數(shù)是3,那么就找到3個(gè)最適合的DataNode,把他們排成一個(gè)pipeline.DataStreamer把Packet按隊(duì)列輸出到管道的第一個(gè)Datanode中,第一個(gè)DataNode又把Packet輸出到第二個(gè)DataNode中,以此類推;
5)DFSOutputStream還有一個(gè)對列叫Ack Quene,也是有Packet組成,等待DataNode的收到響應(yīng),當(dāng)Pipeline中的所有DataNode都表示已經(jīng)收到的時(shí)候,這時(shí)Akc Quene才會把對應(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
##移動/改名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. 不接受對名字空間的更改(只讀)?
# 2. 不復(fù)制或刪除塊?
# Namenode 會在啟動時(shí)自動進(jìn)入安全模式,當(dāng)配置的塊最小百分比數(shù)滿足最小的副本數(shù)條件時(shí),會自動離開安全模式。安全模式可以手動進(jìn)入,但是這樣的話也必須手動關(guān)閉安全模式。
5.2HDFS中常用到的命令
#運(yùn)行 HDFS 文件系統(tǒng)檢查工具
hadoop fsck