共计 3261 个字符,预计需要花费 9 分钟才能阅读完成。
EC 介绍
Erasure Coding 简称 EC,中文名:纠删码
EC(纠删码)是一种编码技术,在 HDFS 之前,这种编码技术在便宜磁盘冗余阵列(RAID)中利用最宽泛 (RAID 介绍:大数据准备常识 - 存储磁盘、磁盘冗余阵列 RAID 介绍),RAID 通过条带化技术实现 EC,条带化技术就是一种主动将 I/O 的负载平衡到多个物理磁盘上的技术,原理就是将一块间断的数据分成很多小局部并把他们别离存储到不同磁盘下来,这就能使多个过程同时拜访数据的多个不同局部而不会造成磁盘抵触(当多个过程同时拜访一个磁盘时,可能会呈现磁盘抵触),而且在须要对这种数据进行程序拜访的时候能够取得最大水平上的 I/O 并行能力,从而取得十分好的性能。 在 HDFS 中,把间断的数据分成很多的小局部称为条带化单元,对于原始数据单元的每个条带单元,都会计算并存储肯定数量的奇偶测验单元,计算的过程称为编码,能够通过基于残余数据和奇偶校验单元的解码计算来复原任何条带化单元上的谬误。
HDFS 数据冗余存储策略
HDFS 的存储策略是正本机制,这种存储形式使得数据存储的安全性失去进步,但同时也带来了额定的开销,HDFS 默认的 3 正本计划在存储空间和其余资源(如网络带宽)上有 200% 的额定开销,然而对于 I / O 流动绝对较低的数据,在失常期间很少拜访其余块正本,然而依然耗费与第一个正本雷同的资源量。因而,HDFS 3.x 版本一个重大改良就是应用纠删码(EC)代替正本机制,纠删码技术提供了与正本机制雷同的容错能力,而存储空间却少得多。在典型的纠删码(EC)设置中,存储开销不超过 50%。
EC 算法实现原理
EC 的实现算法有很多种,较为常见的一种算法是Reed-Solomon(RS),它有两个参数,记为RS(k,m),k 示意数据块,m 示意校验块,有多少个校验块就最多可容忍多少个块(包含数据块和校验块)失落,具体原理通过如下例子解释:
咱们应用 RS(3,2),示意应用 3 个原始数据块,2 个校验块
例:有 7、8、9 三个原始数据,通过 矩阵乘法,计算出来两个校验数据 50、122。这时原始数据加上校验数据,一共五个数据:7、8、9、50、122,能够任意丢两个,而后通过算法进行复原
GT 是生成矩阵,RS(k,m)的生成矩阵就是 m 行 k 列的矩阵
Data 代表原始数据,7,8,9 代表原始数据块
Parity 代表校验数据,50,122 代表校验数据块
所以 3 个原始数据块,如果应用 2 个校验块,EC 编码总共占用 5 个数据块的磁盘空间,与 2 正本机制占用 6 个数据块的磁盘空间容错能力相当。
EC 的利用场景
将 EC 技术集成进 HDFS 能够进步存储效率,同时仍提供与传统的基于正本的 HDFS 部署相似的数据持久性。例如,一个具备 6 个块的 3 正本文件将耗费 6 * 3 = 18 个磁盘空间。然而,应用 EC(6 个数据,3 个校验)部署时,它将仅耗费 9 个磁盘空间块。
然而 EC 在编码过程及数据重建期间会大量的应用 CPU 资源,并且数据大部分是执行近程读取,所以还会有大量的网络开销。
所以,对于 CPU 资源缓和且存储老本较低的状况下,能够采纳正本机制存储数据,对于 CPU 资源有残余且存储老本较高的状况下,能够采纳 EC 机制存储数据。
EC 在 HDFS 的架构
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 进行复原工作。此过程相似于失败时如何从新复原正本的块。重建执行三个要害的工作节点:
- 从源节点读取数据:应用专用线程池从源节点并行读取输出数据。基于 EC 策略,对所有源指标的发动读取申请,并仅读取起码数量的输出块进行重建。
- 解码数据并生成输入数据:从输出数据解码新数据和奇偶校验块。所有失落的数据和奇偶校验块一起解码。
- 将生成的数据块传输到指标节点:解码实现后,复原的块将传输到指标 DataNodes。
纠删码策略:为了适应异构的工作负载,HDFS 群集中的文件和目录容许具备不同的复制和纠删码策略。纠删码策略封装了如何对文件进行编码 / 解码。每个策略由以下信息定义:
- EC 模式:这包含 EC 组(例如 6 + 3)中的数据和奇偶校验块的数量,以及编解码器算法(例如 Reed-Solomon,XOR)。
- 条带化单元的大小。这确定了条带读取和写入的粒度,包含缓冲区大小和编码工作。
咱们能够通过 XML 文件定义本人的 EC 策略,该文件必须蕴含以下三个局部:
- layoutversion:这示意 EC 策略 XML 文件格式的版本。
- schemas:这包含所有用户定义的 EC 模式。
- policies:这包含所有用户定义的 EC 策略,每个策略均由 schema id 和条带化单元的大小(cellsize)组成。
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 可能更适合。
在正本机制下,咱们能够设置正本因子,指定正本的数量,然而在 EC 策略下,指定正本因子是没有意义的,因为它始终为 1,无奈通过相干命令进行更改。