HDFS目前存儲文件的方案是將一個文件切分紅多個Block進行存儲,一般一個Block 64MB或者128MB,每一個Block有多個副本(replica),每一個副本做爲一個總體存儲在一個DataNode上,這種方法在增長可用性的同時也增長了存儲成本。ErasureCode經過將M個數據block進行編碼(Reed-Solomon,LRC),生成K個校驗(parity)block, 這M+K個block組成一個block group,能夠同時容忍K個block失敗,任何K個block均可以由其餘M個block算出來. overhead是K/M.html
以M=6,K=3爲例,使用EC以前,假設block副本數爲3,那麼6個block一共18個副本,overhead是200%,使用EC後,9個block,每一個block只需一個副本,一共9個副本,其中6個數據副本,3個校驗副本,overhead是3/6=50%.git
HDFS-RAID 這個方案是facebook在 Hadoop 0.20-append分支上作的,爲了避免引入複雜度,基於HDFS,沒有修改HDFS。只支持離線(異步)EC。RaidNode按期掃描配置發現須要轉成EC的文件,轉換過程能夠本地計算也能夠經過MapReduce Job。RaidNode內部有一個BlockFixer線程按期檢查被配置成EC的文件路徑,若是文件有丟失的block或者corrupt的block,就本地重算或者經過MapReduce Job來重算,而後將生成的block插入文件系統中。客戶端方面,不須要修改任何代碼,只須要修改配置告訴它使用的文件系統是DistributedRaidFileSystem,它封裝了DFSClient,截獲DFSClient的請求,當DFSClient拋出CheckSumException或者BlockMissingException時,DRFS捕獲這些異常,定位到相應的parity file,而後從新算出丟失的block,隨後返回給客戶端. HDFS-RAID 詳解看這github
HDFS-7285 和HDFS-RAID不一樣,它是社區最新的正在開發中的將編碼過程集成到HDFS內部的方案,須要對整個HDFS內部實現進行改造,包括DataNode,NameNode還有DFSClient,該方案同時支持在線和離線EC。apache
當前HDFS block的副本做爲一個總體連續(contiguous)的存儲在一個DataNode上,在locality上具備必定的優點,特別是對於MapReduce這樣的應用,可是這種方法很差作在線EC。當前社區方案不以block爲單位進行EC,而是以strip爲單位進行EC(HDFS依舊管理Block)設計思路參考了QFS。對於配置了EC的文件,客戶端寫入時將文件的數據切成一個個的64KB的strip,相鄰的strip發往不一樣的DataNode,好比當前使用(6,3)-Reed-solomon編碼,當前正在寫的文件有6個strip: strip1, strip2, strip3, strip4, strip5, strip6, 那麼這6個strip和相應的編碼出來的3個校驗strip共9個strip會並行的發往9個不一樣的DataNode。這種方式寫入性能更好,可是也會對網卡出口帶來一些壓力,同時犧牲了locality。若是文件大小不是64KB * 6的整數倍(本文例子),那麼最後一個strip group顯然不是滿的,這時客戶端還會將最後一個strip group的長度記在校驗塊中,後續讀的時候,能夠根據這個長度和數據塊長度還有文件長度來校驗。網絡
對於append和hflush操做,最後一個parity strip group極可能尚未切換成新的strip group,這就須要DataNode更新最後一個parity strip的數據。app
讀操做,丟失block時,只須要讀9個DataNode中任意6個DataNode便可修復。修復過程須要讀多個DataNode,耗費網絡帶寬和磁盤IO。Xorbas在facebook的HDFS-RAID基礎上增長了LRC實現,LRC修復數據須要讀的分片數更少,所以比Reed-Solomon修復數據更快,可是在存儲成本上高14%.異步
ECClient模塊封裝了以上這些讀寫操做。ide
該方案也支持離線EC,能夠異步的將多副本文件轉成EC文件,經過集成在NameNode中的ECManager和DataNode上的ECWorker來支持。命令行工具提供replication和ec之間的轉換,能夠經過命令行配置哪些文件/目錄使用EC. 在轉換方程中,不支持append。facebook的f4系統一樣作的是離線EC,在作到磁盤,主機,機架,數據中心容錯的狀況下,存儲因子作到2.1,看這裏工具
第二個方案比HDFS-RAID更全面,性能更好,在線EC能夠立刻下降存儲成本。可是處於開發中,看狀態還須要好久才能完成。若是須要儘快用上EC,使用HDFS-RAID,可是也須要進行port工做。oop