第二部分:HDFS文件讀取的解析
文件讀取流程
流程分析
使用HDFS提供的客戶(hù)端開(kāi)發(fā)庫(kù)Client,向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求;
Namenode會(huì)視情況返回文件的部分或者全部block列表,對(duì)于每個(gè)block,Namenode都會(huì)返回有該block拷貝的DataNode地址;
客戶(hù)端開(kāi)發(fā)庫(kù)Client會(huì)選取離客戶(hù)端最接近的DataNode來(lái)讀取block;如果客戶(hù)端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).
讀取完當(dāng)前block的數(shù)據(jù)后,關(guān)閉與當(dāng)前的DataNode連接,并為讀取下一個(gè)block尋找最佳的DataNode;
當(dāng)讀完列表的block后,且文件讀取還沒(méi)有結(jié)束,客戶(hù)端開(kāi)發(fā)庫(kù)會(huì)繼續(xù)向Namenode獲取下一批的block列表。
讀取完一個(gè)block都會(huì)進(jìn)行checksum驗(yàn)證,如果讀取datanode時(shí)出現(xiàn)錯(cuò)誤,客戶(hù)端會(huì)通知Namenode,然后再?gòu)南乱粋€(gè)擁有該block拷貝的datanode繼續(xù)讀。
第三部分:HDFS文件寫(xiě)入的解析
文件寫(xiě)入流程
流程分析
使用HDFS提供的客戶(hù)端開(kāi)發(fā)庫(kù)Client,向遠(yuǎn)程的Namenode發(fā)起RPC請(qǐng)求;
Namenode會(huì)檢查要?jiǎng)?chuàng)建的文件是否已經(jīng)存在,創(chuàng)建者是否有權(quán)限進(jìn)行操作,成功則會(huì)為文件
創(chuàng)建一個(gè)記錄,否則會(huì)讓客戶(hù)端拋出異常;
當(dāng)客戶(hù)端開(kāi)始寫(xiě)入文件的時(shí)候,會(huì)將文件切分成多個(gè)packets,并在內(nèi)部以數(shù)據(jù)隊(duì)列"data queue"的形式管理這些packets,并向Namenode申請(qǐng)新的blocks,獲取用來(lái)存儲(chǔ)replicas的合適的datanodes列表,列表的大小根據(jù)在Namenode中對(duì)replication的設(shè)置而定。
開(kāi)始以pipeline(管道)的形式將packet寫(xiě)入所有的replicas中。把packet以流的方式寫(xiě)入第一個(gè)datanode,該datanode把該packet存儲(chǔ)之后,再將其傳遞給在此pipeline中的下一個(gè)datanode,直到最后一個(gè)datanode,這種寫(xiě)數(shù)據(jù)的方式呈流水線(xiàn)的形式。
最后一個(gè)datanode成功存儲(chǔ)之后會(huì)返回一個(gè)ack packet,在pipeline里傳遞至客戶(hù)端,在客戶(hù)端的開(kāi)發(fā)庫(kù)內(nèi)部維護(hù)著"ack queue",成功收到datanode返回的ack packet后會(huì)從"ack queue"移除相應(yīng)的packet。
如果傳輸過(guò)程中,有某個(gè)datanode出現(xiàn)了故障,那么當(dāng)前的pipeline會(huì)被關(guān)閉,出現(xiàn)故障的datanode會(huì)從當(dāng)前的pipeline中移除,剩余的block會(huì)繼續(xù)剩下的datanode中繼續(xù)以pipeline的形式傳輸,同時(shí)Namenode會(huì)分配一個(gè)新的datanode,保持replicas設(shè)定的數(shù)量。
流水線(xiàn)復(fù)制
當(dāng)客戶(hù)端向
HDFS
文件寫(xiě)入數(shù)據(jù)的時(shí)候,一開(kāi)始是寫(xiě)到本地臨時(shí)文件中。假設(shè)該文件的副
本系數(shù)設(shè)置為
3
,當(dāng)本地臨時(shí)文件累積到一個(gè)數(shù)據(jù)塊的大小時(shí),客戶(hù)端會(huì)從
Namenode
獲取一個(gè)
Datanode
列表用于存放副本。然后客戶(hù)端開(kāi)始向第一個(gè)
Datanode
傳輸數(shù)據(jù),第一個(gè)
Datanode
一小部分一小部分
(4 KB)
地接收數(shù)據(jù),將每一部分寫(xiě)入本地倉(cāng)庫(kù),并同時(shí)傳輸該部分到列表中
第二個(gè)
Datanode
節(jié)點(diǎn)。第二個(gè)
Datanode
也是這樣,一小部分一小部分地接收數(shù)據(jù),寫(xiě)入本地
倉(cāng)庫(kù),并同時(shí)傳給第三個(gè)
Datanode
。最后,第三個(gè)
Datanode
接收數(shù)據(jù)并存儲(chǔ)在本地。因此,
Datanode
能流水線(xiàn)式地從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù),并在同時(shí)轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn),數(shù)據(jù)以流水線(xiàn)的
方式從前一個(gè)
Datanode
復(fù)制到下一個(gè)
更細(xì)節(jié)的原理
客戶(hù)端創(chuàng)建文件的請(qǐng)求其實(shí)并沒(méi)有立即發(fā)送給
Namenode
,事實(shí)上,在剛開(kāi)始階
段
HDFS
客戶(hù)端會(huì)先將文件數(shù)據(jù)緩存到本地的一個(gè)臨時(shí)文件。應(yīng)用程序的寫(xiě)操作被透
明地重定向到這個(gè)臨時(shí)文件。當(dāng)這個(gè)臨時(shí)文件累積的數(shù)據(jù)量超過(guò)一個(gè)數(shù)據(jù)塊的大小
,客戶(hù)端才會(huì)聯(lián)系
Namenode
。
Namenode
將文件名插入文件系統(tǒng)的層次結(jié)構(gòu)中,并
且分配一個(gè)數(shù)據(jù)塊給它。然后返回
Datanode
的標(biāo)識(shí)符和目標(biāo)數(shù)據(jù)塊給客戶(hù)端。接著
客戶(hù)端將這塊數(shù)據(jù)從本地臨時(shí)文件上傳到指定的
Datanode
上。當(dāng)文件關(guān)閉時(shí),在臨
時(shí)文件中剩余的沒(méi)有上傳的數(shù)據(jù)也會(huì)傳輸?shù)街付ǖ?/span>
Datanode
上。然后客戶(hù)端告訴
Namenode
文件已經(jīng)關(guān)閉。此時(shí)
Namenode
才將文件創(chuàng)建操作提交到日志里進(jìn)行存儲(chǔ)
。如果
Namenode
在文件關(guān)閉前宕機(jī)了,則該文件將丟失。
第四部分:副本機(jī)制
特點(diǎn)
1.
數(shù)據(jù)類(lèi)型單一
2.
副本數(shù)比較多
3.
寫(xiě)文件時(shí)副本的放置方法
4.
動(dòng)態(tài)的副本創(chuàng)建策略
5.
弱化的副本一致性要求
副本擺放策略
修改副本數(shù)
1.集群只有三個(gè)Datanode,hadoop系統(tǒng)replication=4時(shí),會(huì)出現(xiàn)什么情況?
對(duì)于上傳文件到hdfs上時(shí),當(dāng)時(shí)hadoop的副本系數(shù)是幾,這個(gè)文件的塊數(shù)副本數(shù)就會(huì)有幾份,無(wú)論以后你怎么更改系統(tǒng)副本系統(tǒng),這個(gè)文件的副本數(shù)都不會(huì)改變,也就說(shuō)上傳到分布式系統(tǒng)上的文件副本數(shù)由當(dāng)時(shí)的系統(tǒng)副本數(shù)決定,不會(huì)受replication的更改而變化,除非用命令來(lái)更改文件的副本數(shù)。因?yàn)閐fs.replication實(shí)質(zhì)上是client參數(shù),在create文件時(shí)可以指定具體replication,屬性dfs.replication是不指定具體replication時(shí)的采用默認(rèn)備份數(shù)。文件上傳后,備份數(shù)已定,修改dfs.replication是不會(huì)影響以前的文件的,也不會(huì)影響后面指定備份數(shù)的文件。只影響后面采用默認(rèn)備份數(shù)的文件。但可以利用hadoop提供的命令后期改某文件的備份數(shù):hadoop fs -setrep -R 1。如果你是在hdfs-site.xml設(shè)置了dfs.replication,這并一定就得了,因?yàn)槟憧赡軟](méi)把conf文件夾加入到你的 project的classpath里,你的程序運(yùn)行時(shí)取的dfs.replication可能是hdfs-default.xml里的 dfs.replication,默認(rèn)是3??赡苓@個(gè)就是造成你為什么dfs.replication老是3的原因。你可以試試在創(chuàng)建文件時(shí),顯式設(shè)定replication。replication一般到3就可以了,大了意義也不大。
轉(zhuǎn)載請(qǐng)注明出處【
http:///forum/blogPost/list/5936.html#19653】
|
|
來(lái)自: 昵稱(chēng)15473813 > 《云存儲(chǔ)》