> 本文由云+社区发表
做为大数据生态系统中最重要的底层存储文件系统HDFS,为了保证系统的可靠性,HDFS通过多副本的冗余来防止数据的丢失。通常,HDFS中每一份数据都设置两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。随着数据量的增长,复制的代价也变得越来越明显:传统的3份复制相当于增加了200%的存储开销,给存储空间和网络带宽带来了很大的压力。因此,在保证可靠性的前提下如何提高存储利用率已成为当前HDFS应用的主要问题之一。
针对这些问题,英特尔、Cloudera、华为以及其他的Apache Hadoop communit共同参与开始引入纠删码(Erasure Coding,EC)技术,在保证数据可靠性的同时大幅降低存储开销,**节省2倍的存储空间**。该feature计划在Hadoop3.0版本发布。
# 什么是纠删码 EC
Erasure coding纠删码技术简称EC,是一种数据保护技术。最早用于通信行业中数据传输中的数据恢复,是一种编码容错技术。他通过在原始数据中加入新的校验数据,使得各个部分的数据产生关联性。在一定范围的数据出错情况下,通过纠删码技术都可以进行恢复。
在存储系统中,纠删码技术主要是通过利用纠删码算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。其基本思想是将k块原始的数据元素通过一定的编码计算,得到m块校验元素。对于这k+m块元素,当其中任意的m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的k块数据。生成校验的过程被成为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。
Reed-Solomon(RS)码是存储系统较为常用的一种纠删码,它有两个参数k和m,记为RS(k,m)。如图1所示,k个数据块组成一个向量被乘上一个生成矩阵(Generator Matrix)GT从而得到一个码字(codeword)向量,该向量由k个数据块和m个校验块构成。如果一个数据块丢失,可以用(GT)-1乘以码字向量来恢复出丢失的数据块。RS(k,m)最多可容忍m个块(包括数据块和校验块)丢失。
![img](https://ask.qcloudimg.com/draft/2187473/6zezdkyawe.png?imageView2/2/w/1620)EC
# HDFS引入EC码的优势和劣势
### 优势
EC码的优势是显而易见的,可以大幅度的降低数据的存储空间。特别是PB、EB级的场景下,会极大的削减存储的成本。
### 劣势
EC技术的优势确实明显,但是他的使用也是需要一些代价的,一旦数据需要恢复,他会造成两大资源的消耗:
网络带宽消耗(数据恢复需要去读其他的数据块和校验块),CPU消耗(编解码计算)。
# GPU、TPU加速纠删码的运算
从上面的EC码优缺点对比可以看出,虽然EC码可以大幅的节省空间,但是因为在存储和恢复的过程中需要额外的运算。用在线上系统的时候,一旦有节点挂掉触发数据恢复,计算量是比较大的,可能会对集群的整体性能造成影响,拖慢正常的计算任务。
在上面的介绍中我们看到,EC码的计算实际上就是矩阵相乘的计算,而目前AI业界最火热的神经网络的计算也是当量的矩阵相乘相加。由此我们可以大胆的想象,是否可以利用目前GPU和TPU对矩阵运算的优化,来加速EC码的计算性能呢?
目前业界比较领先的两个AI计算加速芯片分别为NVIDIA的Volta GPU架构和Google的TPU。
**对于纯矩阵相加相乘的运算,GPU或TPU相比于CPU,性能的提升可以达到50~80倍。**
### NVIDIA
NVIDIA的Tesla V100提供了120个专门用于矩阵运算的Tensor Core。每个 Tensor Core 包含一个 4x4x4 的矩阵处理阵列来完成 D=A x B + C 的运算,其中 A、B、C、D 是 4×4 的矩阵,如下图所示。矩阵相乘的输入 A 和 B 是 FP16 矩阵,相加矩阵 C 和 D 可能是 FP16 矩阵或 FP32 矩阵。
![img](https://ask.qcloudimg.com/draft/2187473/u58yl77kgp.jpg?imageView2/2/w/1620)Tensor Core
每个 Tensor Core 每个时钟可执行 64 次浮点 FMA 混合精度运算(FP16 乘法与 FP32 累加),一个 SM 单元中的 8 个 Tensor Core 每个时钟可执行共计 1024 次浮点运算。相比于使用标准 FP32 计算的 Pascal GP100 而言,单个 SM 下的每个深度学习应用的吞吐量提升了 8 倍,所以这最终使得 Volta V100 GPU 相比于 Pascal P100 GPU 的吞吐量一共提升了 12 倍。Tensor Core 在与 FP32 累加结合后的 FP16 输入数据之上操作。FP16 的乘法得到了一个全精度结果,该结果在 FP32 和其他给定的 4x4x4 矩阵乘法点积的乘积运算之中进行累加。
![img](https://ask.qcloudimg.com/draft/2187473/f1mhx0lq0i.jpg?imageView2/2/w/1620)
### TPU
TPU是Google为TensorFlow定制化的AI加速芯片。这个TPU芯片是面向datacenter inference应用。它的核心是由65,536个8-bit MAC组成的矩阵乘法单元(matrix multiply unit),峰值可以达到92 TeraOps/second (TOPS) 。有一个很大的片上存储器,一共28 MiB。它可以支持MLP,CNN和LSTM这些常见的NN网络,并且支持TensorFLow框架。摘要里面还可以看出,传统CPU和GPU使用的技术(caches, out-of-order execution, multithreading, multiprocessing, prefetching)它都没用,原因是它面向的应用都是deterministic execution model,这也是它可以实现高效的原因。它的平均性能(TOPS)可以达到CPU和GPU的15到30倍,能耗效率(TOPS/W)能到30到80倍。如果使用GPU的DDR5 memory,这两个数值可以达到大约GPU的70倍和CPU的200倍。
![img](https://ask.qcloudimg.com/draft/2187473/wvxayibtjp.jpeg?imageView2/2/w/1620)TPU
# 前景分析
由于HDFS的内部逻辑已然十分复杂,社区对于HDFS EC码的改造需要分几个步奏来实现:
1. 用户可以读和写一个条形布局(Striping Layout)的文件;如果该文件的一个块丢失,后台能够检查出并恢复;如果在读的过程中发现数据丢失,能够立即解码出丢失的数据从而不影响读操作。
2. 支持将一个多备份模式(HDFS原有模式)的文件转换成连续布局(Contiguous Layout),以及从连续布局转换成多备份模式。
3. 编解码器将作为插件,用户可指定文件所使用的编解码器。
编码器可以作为独立的插件,从而可以将使用AI加速硬件的编码器作为独立的插件,分发到有GPU或TPU硬件资源的集群中。特别是Hadoop 3.0的yarn组件目前也在也k8s深度整合,做一些GPU硬件资源的调度和管理。
**此文已由作者授权腾讯云+社区在各渠道发布**
**获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号**
有疑问加站长微信联系(非本文作者)