本文由云 + 社区发表
做为大数据生态系统中最重要的底层存储文件系统 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 个块(包括数据块和校验块)丢失。
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 矩阵。
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 矩阵乘法点积的乘积运算之中进行累加。
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 倍。
TPU
前景分析
由于 HDFS 的内部逻辑已然十分复杂,社区对于 HDFS EC 码的改造需要分几个步奏来实现:
用户可以读和写一个条形布局(Striping Layout)的文件;如果该文件的一个块丢失,后台能够检查出并恢复;如果在读的过程中发现数据丢失,能够立即解码出丢失的数据从而不影响读操作。
支持将一个多备份模式(HDFS 原有模式)的文件转换成连续布局(Contiguous Layout),以及从连续布局转换成多备份模式。
编解码器将作为插件,用户可指定文件所使用的编解码器。
编码器可以作为独立的插件,从而可以将使用 AI 加速硬件的编码器作为独立的插件,分发到有 GPU 或 TPU 硬件资源的集群中。特别是 Hadoop 3.0 的 yarn 组件目前也在也 k8s 深度整合,做一些 GPU 硬件资源的调度和管理。
此文已由作者授权腾讯云 + 社区在各渠道发布
获取更多新鲜技术干货,可以关注我们腾讯云技术社区 - 云加社区官方号及知乎机构号