HDFS原理及操作
1巷疼、HDFS原理
HDFS(Hadoop Distributed File System)是一個分布式文件系統(tǒng),是谷歌的GFS山寨版本。它具有高容錯性并提供了高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應用佛南,它提供了一個高度容錯性和高吞吐量的海量數(shù)據(jù)存儲解決方案梗掰。
高吞吐量訪問:HDFS的每個Block分布在不同的Rack上,在用戶訪問時嗅回,HDFS會計算使用最近和訪問量最小的服務器給用戶提供及穗。由于Block在不同的Rack上都有備份,所以不再是單數(shù)據(jù)訪問妈拌,所以速度和效率是非秤堤常快的。另外HDFS可以并行從服務器集群中讀寫尘分,增加了文件讀寫的訪問帶寬猜惋。
高容錯性:系統(tǒng)故障是不可避免的,如何做到故障之后的數(shù)據(jù)恢復和容錯處理是至關重要的培愁。HDFS通過多方面保證數(shù)據(jù)的可靠性著摔,多份復制并且分布到物理位置的不同服務器上,數(shù)據(jù)校驗功能定续、后臺的連續(xù)自檢數(shù)據(jù)一致性功能都為高容錯提供了可能谍咆。
線性擴展:因為HDFS的Block信息存放到NameNode上,文件的Block分布到DataNode上私股,當擴充的時候僅僅添加DataNode數(shù)量摹察,系統(tǒng)可以在不停止服務的情況下做擴充,不需要人工干預倡鲸。
2供嚎、HDFS架構
如上圖所示HDFS是Master和Slave的結構,分為NameNode峭状、Secondary NameNode和DataNode三種角色克滴。
NameNode:在Hadoop1.X中只有一個Master節(jié)點,管理HDFS的名稱空間和數(shù)據(jù)塊映射信息优床、配置副本策略和處理客戶端請求劝赔;
Secondary NameNode:輔助NameNode,分擔NameNode工作胆敞,定期合并fsimage和fsedits并推送給NameNode着帽,緊急情況下可輔助恢復NameNode;
DataNode:Slave節(jié)點移层,實際存儲數(shù)據(jù)仍翰、執(zhí)行數(shù)據(jù)塊的讀寫并匯報存儲信息給NameNode;
3幽钢、HDFS讀操作
1、客戶端通過調用FileSystem對象的open()方法來打開希望讀取的文件傅是,對于HDFS來說匪燕,這個對象時分布文件系統(tǒng)的一個實例蕾羊;
2、DistributedFileSystem通過使用RPC來調用NameNode以確定文件起始塊的位置帽驯,同一Block按照重復數(shù)會返回多個位置龟再,這些位置按照Hadoop集群拓撲結構排序,距離客戶端近的排在前面尼变;
3利凑、 前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象嫌术,DFSInputStream可以方便的管理datanode和namenode數(shù)據(jù)流哀澈,客戶端對這個輸入流調用read()方法;
4度气、存儲著文件起始塊的DataNode地址的DFSInputStream隨即連接距離最近的DataNode割按,通過對數(shù)據(jù)流反復調用read()方法,可以將數(shù)據(jù)從DataNode傳輸?shù)娇蛻舳耍?/p>
5磷籍、 到達塊的末端時适荣,DFSInputStream會關閉與該DataNode的連接,然后尋找下一個塊的最佳DataNode院领,這些操作對客戶端來說是透明的弛矛,客戶端的角度看來只是讀一個持續(xù)不斷的流;
6比然、 一旦客戶端完成讀取丈氓,就對FSDataInputStream調用close()方法關閉文件讀取
4、HDFS寫操作
1谈秫、客戶端通過調用DistributedFileSystem的create()方法創(chuàng)建新文件扒寄;
2、DistributedFileSystem通過RPC調用NameNode去創(chuàng)建一個沒有Blocks關聯(lián)的新文件拟烫,創(chuàng)建前NameNode會做各種校驗该编,比如文件是否存在、客戶端有無權限去創(chuàng)建等硕淑。如果校驗通過课竣,NameNode會為創(chuàng)建新文件記錄一條記錄,否則就會拋出IO異常置媳;
3于樟、前兩步結束后會返回FSDataOutputStream的對象,和讀文件的時候相似拇囊,F(xiàn)SDataOutputStream被封裝成DFSOutputStream迂曲,DFSOutputStream可以協(xié)調NameNode和Datanode×认客戶端開始寫數(shù)據(jù)到DFSOutputStream路捧,DFSOutputStream會把數(shù)據(jù)切成一個個小的數(shù)據(jù)包关霸,并寫入內部隊列稱為“數(shù)據(jù)隊列”(Data Queue);
4杰扫、DataStreamer會去處理接受Data Queue队寇,它先問詢NameNode這個新的Block最適合存儲的在哪幾個DataNode里,比如重復數(shù)是3章姓,那么就找到3個最適合的DataNode佳遣,把他們排成一個pipeline.DataStreamer把Packet按隊列輸出到管道的第一個Datanode中,第一個DataNode又把Packet輸出到第二個DataNode中凡伊,以此類推零渐;
5、HFSOutputStream還有一個對列叫Ack Quene窗声,也是有Packet組成相恃,等待DataNode的收到響應,當Pipeline中的所有DataNode都表示已經(jīng)收到的時候笨觅,這時Akc Quene才會把對應的Packet包移除掉拦耐;
6、客戶端完成寫數(shù)據(jù)后調用close()方法關閉寫入流见剩;
7杀糯、ataStreamer把剩余的包都刷到Pipeline里然后等待Ack信息,收到最后一個Ack后苍苞,通知NameNode把文件標示為已完成固翰。
5、HDFS中常用到的命令
lhadoop fs
hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst 與hadoop fs -put功能類似羹呵。
hadoop fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs骂际,同時刪除本地文件。
lhadoop fsadmin
hadoop dfsadmin -report
hadoop dfsadmin -safemode enter | leave | get | wait
hadoop dfsadmin -setBalancerBandwidth 1000
lhadoop fsck
lstart-balancer.sh
6冈欢、測試例子
import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
public class FileSystemCat {
public static void main(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem. get(URI.create (uri), conf);
InputStream in = null;
try {
in = fs.open( new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
6.1 創(chuàng)建代碼目錄
使用如下命令啟動Hadoop
cd /app/hadoop-1.1.2/bin
./start-all.sh
在/app/hadoop-1.1.2目錄下使用如下命令建立myclass和input目錄:
cd /app/hadoop-1.1.2
mkdir myclass
mkdir input
6.2 建立例子文件上傳到HDFS中
進入/app/hadoop-1.1.2/input目錄歉铝,在該目錄中建立quangle.txt文件
cd /app/hadoop-1.1.2/input
touch quangle.txt
vi quangle.txt
內容為:
On the top of the Crumpetty Tree The Quangle Wangle sat,、 But his face you could not see, On account of his Beaver Hat.
使用如下命令在hdfs中建立目錄/class4
hadoop fs -mkdir /class4
hadoop fs -ls /
把例子文件上傳到hdfs的/class4文件夾中
cd /app/hadoop-1.1.2/input
hadoop fs -copyFromLocal quangle.txt /class4/quangle.txt
hadoop fs -ls /class4
6.3 編譯代碼
在/app/hadoop-1.1.2/myclass目錄中凑耻,使用如下命令編譯代碼:
javac -classpath ../hadoop-core-1.1.2.jar FileSystemCat.java