HDFS是一个高吞吐、高容错的分布式文件系统,可是HDFS在保证高容错的同时也带来了高昂的存储成本,好比有5T的数据存储在HDFS上,按照HDFS的默认3副本机制,将会占用15T的存储空间。那么有没有一种能达到和副本机制相同的容错能力可是能大幅度下降存储成本的机制呢,有,就是在HDFS 3.x 版本引入的纠删码机制。算法
Erasure Coding 简称 EC,中文名:纠删码缓存
EC(纠删码)是一种编码技术,在 HDFS 以前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用最普遍,RAID 经过条带化技术实现 EC,条带化技术就是一种自动将 I/O 的负载均衡到多个物理磁盘上的技术,原理就是将一块连续的数据分红不少小部分并把他们分别存储到不一样磁盘上去,这就能使多个进程同时访问数据的多个不一样部分而不会形成磁盘冲突(当多个进程同时访问一个磁盘时,可能会出现磁盘冲突),并且在须要对这种数据进行顺序访问的时候能够得到最大程度上的 I/O 并行能力,从而得到很是好的性能。安全
在HDFS中,把连续的数据分红不少的小部分称为条带化单元,对于原始数据单元的每一个条带单元,都会计算并存储必定数量的奇偶检验单元,计算的过程称为编码,能够经过基于剩余数据和奇偶校验单元的解码计算来恢复任何条带化单元上的错误。网络
HDFS的存储策略是副本机制,这种存储方式使得数据存储的安全性获得提升,但同时也带来了额外的开销,HDFS默认的3副本方案在存储空间和其余资源(如网络带宽)上有200%的额外开销,可是对于I/O活动相对较低的数据,在正常期间不多访问其余块副本,可是仍然消耗与第一个副本相同的资源量。架构
所以,HDFS 3.x 版本一个重大改进就是使用纠删码(EC)代替副本机制,纠删码技术提供了与副本机制相同的容错能力,而存储空间却少得多。在典型的纠删码(EC)设置中,存储开销不超过50%。负载均衡
EC的实现算法有不少种,较为常见的一种算法是Reed-Solomon(RS),它有两个参数,记为RS(k,m)
,k 表示数据块,m 表示校验块,有多少个校验块就最多可容忍多少个块(包括数据块和校验块)丢失,具体原理经过以下例子解释:koa
咱们使用RS(3,2)
,表示使用 3 个原始数据块,2 个校验块。分布式
例:由RS(3,2)
可求出它的生成矩阵 GT,和 七、八、9 三个原始数据块 Data,经过矩阵乘法,计算出来两个校验数据块 50、122。这时原始数据加上校验数据,一共五个数据块:七、八、九、50、122,能够任意丢两个,而后经过算法进行恢复,矩阵乘法以下图所示:ide
GT 是生成矩阵,RS(k,m) 的生成矩阵就是 m 行 k 列的矩阵;
Data 表明原始数据,7,8,9表明原始数据块;
Parity 表明校验数据,50,122表明校验数据块。oop
因此3个原始数据块,若是使用2个校验块,EC编码总共占用5个数据块的磁盘空间,与2副本机制占用6个数据块的磁盘空间容错能力至关。
将EC技术集成进HDFS能够提升存储效率,同时仍提供与传统的基于副本的HDFS部署相似的数据持久性。例如,一个具备6个块的3副本文件将消耗 6 * 3 = 18 个磁盘空间。可是,使用EC(6个数据,3个校验)部署时,它将仅消耗9个磁盘空间块。
可是EC在编码过程及数据重建期间会大量的使用CPU资源,而且数据大部分是执行远程读取,因此还会有大量的网络开销。
因此,对于CPU资源紧张且存储成本较低的状况下,能够采用副本机制存储数据,对于CPU资源有剩余且存储成本较高的状况下,能够采用EC机制存储数据。
HDFS 是直接使用 Online EC
(以EC格式写入数据),避免了转换阶段并节省了存储空间。Online EC
还经过并行利用多个磁盘主轴来加强顺序I/O
性能。在具备高端网络的群集中,这尤为理想。其次,它天然地将一个小文件分发到多个DataNode,而无需将多个文件捆绑到一个编码组中。这极大地简化了文件操做,例如删除,磁盘配额以及namespaces之间的迁移。
在通常HDFS集群中,小文件可占总存储消耗的3/4以上,为了更好的支持小文件,HDFS目前支持条形布局(Striping Layout)的EC方案,而HDFS连续布局(Contiguous Layout)方案正在开发中。
优势:
缺点:
优势:
缺点:
传统模式下 HDFS 中文件的基本构成单位是block
,而EC模式下文件的基本构成单位是block group
。以RS(3,2)为例,每一个block group
包含3个数据块,2个校验块。
HDFS对于引入EC模式所作的主要扩展以下:
NameNode:HDFS文件在逻辑上由block group组成,每一个block group包含必定数量的内部块,为了减小这些内部块对NameNode内存消耗,HDFS引入了新的分层块命名协议。能够从其任何内部块的ID推断出block group的ID。这容许在块组而不是块的级别进行管理。
Client:客户端读取和写入路径获得了加强,能够并行处理block group中的多个内部块。
DataNode:DataNode运行额外ErasureCodingWorker(ECWorker)任务,用于对失败的纠删编码块进行后台恢复。NameNode检测到失败的EC块, 会选择一个DataNode进行恢复工做。此过程相似于失败时如何从新恢复副本的块。重建执行三个关键的任务节点:
纠删码策略:为了适应异构的工做负载,HDFS群集中的文件和目录容许具备不一样的复制和纠删码策略。纠删码策略封装了如何对文件进行编码/解码。每一个策略由如下信息定义:
咱们能够经过XML文件定义本身的EC策略,该文件必须包含如下三个部分:
Hadoop conf
目录中有一个配置EC策略的XML示例文件,配置时能够参考该文件,文件名称为user_ec_policies.xml.template
。
纠删码对群集在CPU和网络方面有必定的要求:
编码和解码工做会消耗HDFS客户端和DataNode上的额外CPU。
纠删码文件也分布在整个机架上,以实现机架容错。这意味着在读写条带化文件时,大多数操做都是在机架上进行的。所以,网络二等分带宽很是重要。
对于机架容错,拥有至少与配置的EC条带宽度同样多的机架也很重要。对于EC策略RS(6,3)
,这意味着最少要有9个机架,理想状况下是10或11个机架,以处理计划内和计划外的中断。对于机架少于条带宽度的群集,HDFS没法保持机架容错,但仍会尝试在多个节点之间分布条带化文件以保留节点级容错。
在HDFS默认状况下,全部的EC策略是被禁止的,咱们能够根据群集的大小和所需的容错属性,经过hdfs ec [-enablePolicy -policy]
命令启用EC策略。
例如,对于具备9个机架的群集,像RS-10-4-1024k
这样的策略将不会保留机架级的容错能力,而RS-6-3-1024k
或RS-3-2-1024k
可能更合适。
RS-10-4-1024k
表示有10个数据块,4个校验块。
在副本机制下,咱们能够设置副本因子,指定副本的数量,可是在EC策略下,指定副本因子是没有意义的,由于它始终为1,没法经过相关命令进行更改。