1.副本選擇
HDFS會(huì)盡量使用離程序最近的副本來滿足用戶請(qǐng)求,這樣可以減少總帶寬消耗和讀延時(shí)。如果在讀取程序的同一個(gè)機(jī)架有一個(gè)副本,那么就使用這個(gè)副本;如果HDFS機(jī)群跨了多個(gè)數(shù)據(jù)中心,那么讀取程序?qū)?yōu)先考慮本地?cái)?shù)據(jù)中心的副本。
2.負(fù)載均衡
HDFS的架構(gòu)支持?jǐn)?shù)據(jù)均衡策略。如果某個(gè)DataNode的剩余磁盤空間下降到一定程度,按照均衡策略,系統(tǒng)會(huì)自動(dòng)把數(shù)據(jù)從這個(gè)DataNode移動(dòng)到其他節(jié)點(diǎn)。當(dāng)出現(xiàn)對(duì)某個(gè)文件有很高的需求時(shí),系統(tǒng)可能會(huì)啟動(dòng)一個(gè)計(jì)劃創(chuàng)建該文件的新副本,并重新平衡集群中的其他數(shù)據(jù)。目前這些均衡策略還沒有實(shí)現(xiàn)。
3.客戶端緩存
客戶端創(chuàng)建文件的請(qǐng)求不是立即到達(dá)NameNode, HDFS客戶端先把數(shù)據(jù)緩存到本地的一個(gè)臨時(shí)文件,程序的寫操作透明地重定向到這個(gè)臨時(shí)文件。當(dāng)這個(gè)臨時(shí)文件累積的數(shù)據(jù)超過一個(gè)塊的大?。?4MB)時(shí),客戶端才會(huì)聯(lián)系NameNode。NameNode在文件系統(tǒng)中插入文件名,給它分配一個(gè)數(shù)據(jù)塊,告訴客戶端DataNode的ID和目標(biāo)數(shù)據(jù)塊id,這樣客戶端就把數(shù)據(jù)從本地的緩存刷新到指定的數(shù)據(jù)塊中。當(dāng)文件關(guān)閉后,臨時(shí)文件中剩余的未刷新數(shù)據(jù)也會(huì)被傳輸?shù)紻ataNode中,然后客戶端告訴NameNode文件已關(guān)閉,此時(shí)NameNode才將文件創(chuàng)建操作寫入日志進(jìn)行存儲(chǔ)。如果NameNode在文件關(guān)閉之前死機(jī),那么文件將會(huì)丟失。如果不采用客戶端緩存,網(wǎng)絡(luò)速度和擁塞都會(huì)對(duì)輸出產(chǎn)生很大的影響。
4.流水線復(fù)制
當(dāng)客戶端要寫數(shù)據(jù)到HDFS的文件中時(shí),就像前面介紹的那樣,數(shù)據(jù)一開始會(huì)寫入本地臨時(shí)文件。假設(shè)該文件的復(fù)制因子是3,當(dāng)本地臨時(shí)文件累積到一個(gè)數(shù)據(jù)塊的大小時(shí),客戶端會(huì)從NameNode獲取一個(gè)副本存放的DataNode列表,列表中的DataNode都將保存那個(gè)數(shù)據(jù)塊的一個(gè)副本。客戶端首先向第一個(gè)DataNode傳輸數(shù)據(jù),第一個(gè)DataNode一小塊一小塊(4KB)地接收數(shù)據(jù),寫入到本地庫(kù)的同時(shí),把接受到的數(shù)據(jù)傳輸給列表中的第二個(gè)DataNode;第二個(gè)DataNode以同樣的方式邊收邊傳,把數(shù)據(jù)傳輸給第三個(gè)DataNode;第三個(gè)DataNode把數(shù)據(jù)寫入本地庫(kù)。DataNode從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù)的同時(shí),即時(shí)把數(shù)據(jù)傳給后面的節(jié)點(diǎn),這就是流水線復(fù)制。