传统的方法是分析数据的使用频率,把数据分为热温冷三类数据。对于温冷数据,使用压缩率更高的算法,来下降存储成本。可是没法突破三副本存储策略的固有属性:须要存储三份完整的数据块。算法
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