傳統的方法是分析數據的使用頻率,把數據分爲熱溫冷三類數據。對於溫冷數據,使用壓縮率更高的算法,來下降存儲成本。可是沒法突破三副本存儲策略的固有屬性:須要存儲三份完整的數據塊。算法
Hadoop 分佈式存儲引擎(HDFS)在 3.0 版本中發佈了 EC inside HDFS 重要特性。該 EC(Erasure Coding) 是一種可經過計算降存儲的技術。下面我以 HDFS 支持的一種 EC 存儲策略 RS-3-2-1024k 爲例簡單介紹其原理。對於一個 200MB 的文件,會把數據按 1MB(1024KB) 一個條帶(striped)進行切分,每切分出 3 個 1MB 的數據塊條帶(data striped,記爲 d1-1,d2-1,d3-1),就用這 3 個數據塊條帶計算出兩個 1MB 的校驗塊條帶(parity striped,記爲 p1-1, p2-1),依次循環處理,最後的 2MB 數據只能構成 2 個數據塊條帶(d1-67,d2-67),EC 算法會構建一個全零的假數據塊(d3-67)計算出最後兩個校驗塊條帶(p1-67,p2-67)。實際存儲在 DN 上的 5(3 個數據塊加 2 個校驗塊) 個 EC 數據塊分別由(d1-1..d1-67, d2-1..d2-67, d3-1..d3-66, p1-1..p1-67, p2-1..p2-67)組合成的數據塊。若是丟失其中任意兩個數據塊,均可以使用剩下的 3 個塊算出丟失的兩個塊。markdown
一個 200MB 的文件按三副本方式存儲,須要在不一樣 DN 上存放 3 份完整的數據塊,消耗600MB的存儲空間。而 RS-3-2-1024k只須要 334MB的存儲空間,就能保證數據的冗餘度,而且存儲空間下降了 45%。所以,咱們能夠藉助 EC inside HDFS 技術進一步下降數據存儲成本,提升存儲效率。分佈式
目前hadoop-3.0.0beta1共支持5種糾刪碼策略,分別是:ide
RS-10-4-1024k:使用RS編碼,每10個數據單元(cell),生成4個校驗單元,共14個單元,也就是說:這14個單元中,只要有任意的10個單元存在(無論是數據單元仍是校驗單元,只要總數=10),就能夠獲得原始數據。每一個單元的大小是1024k=1024*1024=1048576。oop
RS-3-2-1024k:使用RS編碼,每3個數據單元,生成2個校驗單元,共5個單元,也就是說:這5個單元中,只要有任意的3個單元存在(無論是數據單元仍是校驗單元,只要總數=3),就能夠獲得原始數據。每一個單元的大小是1024k=1024*1024=1048576。編碼
RS-6-3-1024k:使用RS編碼,每6個數據單元,生成3個校驗單元,共9個單元,也就是說:這9個單元中,只要有任意的6個單元存在(無論是數據單元仍是校驗單元,只要總數=6),就能夠獲得原始數據。每一個單元的大小是1024k=1024*1024=1048576。spa
RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k同樣,只是編碼的算法用的是rs-legacy,應該是以前遺留的rs算法。code
XOR-2-1-1024k:使用XOR編碼(速度比RS編碼快),每2個數據單元,生成1個校驗單元,共3個單元,也就是說:這3個單元中,只要有任意的2個單元存在(無論是數據單元仍是校驗單元,只要總數=2),就能夠獲得原始數據。每一個單元的大小是1024k=1024*1024=1048576。orm