什么是EC码
EC(Erasure code),是一种纠删码,相比多副本复制而言, 纠删码能够以更小的数据冗余度获得更高数据可靠性, 但编码方式较复杂,需要大量计算 。纠删码只能容忍数据丢失,无法容忍数据篡改,纠删码正是得名于此。
纠删的原理">纠删的原理">纠删的原理
EC码中分为数据块和校验块。假设我们的输入数据以D1,D2,...D5的向量来表示,矩阵B为编码矩阵,进行编码后得到D,C组成的矩阵,其中D为数据块,C为校验块。我们的数据写入都需要经过编码后才能进行存储。
冗余度对比
与传统文件被划分为数据块进行存储相比,EC编码的文件以块组为单位对文件进行划分,一个块组中又分为数据块(data block)和校验块(parity block),当一个块组内发生块丢失时,当丢失的块不超过一定数量时,我们能通过块组剩余的块来进行恢复。譬如RS(6-3),意思是一个块组由6个数据块和3个校验块组成,所能容忍的丢块数等于校验块的数量,也就是3。9个块中只要不丢超过3个块,都能通过相关算法进行恢复。(RS代表用的Reed-Solomon编码)
我们以经典的三副本存储和RS(6-3)为例,对比一下两者的数据冗余度。
经典三副本存储,文件被分为若干个Block,而每个Block对应三个副本(Replicas),也就是说,三个副本中有两个副本属于冗余存储,200%的冗余率。
RS(6-3),一个块组内,9个块中有6个是数据块,也就是说只有剩下的3个校验块属于冗余,冗余率为50%。
可见,采用EC码从原理上看,能够大大减少冗余率,提升存储的效率。
EC码文件的存储
EC码文件的存储主要分为连续存储(contiguous storage)和条纹单元存储(stripe cell storage),由于HDFS尚不支持连续存储,我们接下来的一些概念都是围绕条纹单元存储来进行。
条纹单元(Stripe Unit):
在EC码编码的文件中,文件被划分为若干个条纹单元。条纹单元存储中,条纹单元会分散存储到多个DN上。
EC码编码(Encoding)
条纹单元作为encoder的输入,校验单元作为encoder输出,由条纹单元生成校验单元这个过程称为EC码的编码。
每对一个条纹单元进行写入,都会进行编码,生成若干个校验单元,这些校验单元分别写入若干个校验块当中。
EC码解码(Decoding)
剩余条纹单元与校验单元作为解码器输入,最终得到完整的数据,这个恢复数据的过程称为解码。
引用EC码后给架构带来的改变
NN端扩展:正常来说,块组里包含若干个块,开发者引入了新的块命名模式,让我们能从块命名中得出其所属的块组,从而实现块组级别的管理。
Client端扩展:Client可以进行并行读取和写入,DFSStripedOutputStream管理data streamers的一个集合,每个data streamer对应一个存放块组内部块的一个DN。各个data streamers基本上都是异步工作,其中有一个协调者协调整个写入的过程,包括块组的写入结束,新块组的分配,实现了块级别的并行写入,当然,块组级别还是串行写入。在读取方面,DFSStripedInputStream能够把请求读取的文件字节范围转化为块组内多个内部块内的字节范围,进而实现并行读取。HDFS采用的是online EC,边写入边进行编码。
DN端扩展:DN端会跑一个ECWorker的任务,主要是为了后台能对坏EC码块。坏EC码块会被NN检测到,然后选择一个DN做恢复工作,相关的恢复任务通过心跳返回来告知。这个过程跟对坏的Replicated Block恢复过程很相似。重建的过程主要执行这三个关键任务。
1.从source nodes处读取数据,,输入数据被一个特定线程池并行读取。基于EC码策略,只需要读取可用于恢复的最少数量的输入块。
2.解码数据并生成输出数据,新数据和块能通过解码输入数据来得出。所有丢失的数据块和校验块都会被一起解码出来。
3.传输生成的数据块到目标节点,一旦解码完成,恢复的块会被传向目标DN。
EC码策略有不同的模式,它封装了我们去编码/解码的方式。每种方式的定义都包含一下的信息:
1.EC schema,包含一个块组内的数据块和校验块的数量和相关的编码算法。RS(6,3)就是6个数据块,3个校验块,用的Reed-Solomon编码。
2.条带单元的大小,这决定我我们读写的粒度,包括客户端buffer大小,编码的一些工作。
譬如,RS-6-3-1024k,表示RS编码,6个数据块3个校验块,每个条带单元大小是1024k。
EC码策略跟多副本策略是可以共存的,可以设置相关目录强制使用多副本策略而不是用EC码。同样的,具体EC码策略是在目录上设置,当一个文件被创建时,它会使用最近的祖先路径的EC码策略。目录级别的EC码策略只会影响目录内新创建的文件。一旦文件被创建,他的EC码策略就不会改变,除非我们复制这个文件(譬如用distcp),这会重写他的数据。而文件改名或是移动到另一个目录是没用的。
用户也可以通过XML文件自定义一些EC策略,这里就不赘述了,详情可以参考官网资料。
部署
EC码对集群的CPU和网络有了更高要求。
EC码的编码和解码工作会消耗额外的CPU,主要在Client端和DN端。
实现EC码策略至少需要DN达到一定的数目,例如RS(6,3)至少要9个DN。(6个数据块,3个校验块)
为了实现机架级的容错,EC码文件会在机架之间传输,读写条形单元大多数操作都是跨机架的,因此等分带宽非常重要。
同时,有足够的机架对于机架级别的容错也非常重要,每个机架不能持用超过校验块数量的块,也就是说至少需要 (数据块+校验块)/校验块 ,向上取整个机架,否则不能实现机架级的容错。即使机架数量不满足,仍然会将条形写入的文件传播到多个节点,尽力保证节点级的容错。
限制
应用EC码之后,append,truncate,concat,hsync,hflush,setReplication等函数因为技术原因不再支持
参考资料:
Apache Hadoop 3.3.3 – HDFS Erasure Coding
Hadoop 3.0 EC technology - 编程知识
Erasure Code - EC纠删码原理_shelldon的博客-CSDN博客_ec纠删码
Introduction to HDFS Erasure Coding in Apache Hadoop - Cloudera Blog