再聊HDFS Erasure Coding

前言



在之前我的一篇文章中,已经聊到过一次关于HDFS EC方面的内容(文章链接Hadoop 3.0 Erasure Coding 纠删码功能预分析),所以本文算是对其内容的一次补充.之前的文章中主要是从宏观的层面上阐述了HDFS EC的作用以及相应的使用场景,并没有深入到内部相关架构设计以及具体EC算法的的内容.本文主要=阐述的内容正在于这两方面.

Erasure Coding技术



EC是Erasure Coding的缩写,中文名叫做纠删码,是一种能够进行数据错误纠正的技术.EC比较常见的一个使用场景是用于信号通信传输方面.在数据通信过程中,数据信号发生错误是时有发生的事情,EC编码技术是如何做到数据自动纠正的呢?这里就不得不引出EC中使用非常广泛的一个算法:XOR码.

XOR码



XOR是”异或”的意思,XOR码的原理如下:

数据编码时按照位进行异或运算,数据恢复的时候也就是解码时则通过结果与其他数据位进行异或操作的逆运算.

异或操作与我们常见的”与”操作和”或”操作略有不同,遵循”相同为0,不同则为1”的运算原则.比如下面的例子(⊕就是异或操作的意思):

1 ⊕ 1 = 0;
0 ⊕ 0 = 0;
1 ⊕ 0 = 1;
0 ⊕ 1 = 1;
0 ⊕ 1 ⊕ 1 = 0;

现在假设最后一个式子中的第二位,就是数字第一个数字1丢失了,变成了下面这个式子:

0 ⊕ ? ⊕ 1 = 0;

我们可以通过异或操作的逆运算恢复数据,因为最后结果为0,所以0 ⊕ ?的结果应该为1,也就是0 ⊕ ? = 1,因为异或运算,不同才为1,所以这里丢失的数据就是1,数据成功恢复.但是这里暴露出了一个问题,如果丢失或损坏的数据位超过1位的时候,数据好像就不是那么好恢复了,比如丢失了头2位:

? ⊕ ? ⊕ 1 = 0;

这个时候头2位是0,1还是1,0呢?只能说都有可能.OK,从这里我们可以看出XOR编码算法存在可容忍错误过少的问题,那么有什么别的EC算法能帮我们解决这个问题呢?在很多场合下,是会存在多个数据丢失的情况的,并不能确保每次只有1个数据出错的情况.下面介绍的新的编码算法能解决这个棘手的问题.

Reed-Solomon Codes



Reed-Solomon Codes也是EC编码中的一种.Reed-Solomon Codes缩写为RS码,中文名称里德所罗门码.下面说说RS码在HDFS中的使用原理.RS码在使用的时候需要指定2个参数的,RS(k, m),k代表的是data cell数据块的数量,m代表的是parity cell块的数量,parity cell可理解为加密块,因为它是由数据块编码产生的.RS码的恢复原理如下:

数据块如果发生损坏,则可以通过parity cell和其他data cell的解码计算重新恢复.
如果加密块发生损坏,则可以通过data cell重新进行编码生成.

以上数据块与加密块的编解码原理与矩阵运算有点关联,感兴趣的同学可以查阅相关资料继续学习.注意了,以上数据块出错的最大容忍数为m.不过这个数字我们可以进行调整,比如RS(6, 3)或RS(10, 4)等.这里的数据块与加密块的存储方式与传统的数据存放方式略有不同,它是横向式的条带式存储,而不是传统的连续存储方式.可能这句话有点难懂,没有关系,我们继续看下文,后面将给出详细的解释.

HDFS的连续存储与EC的条带式存储



从这节开始,我们慢慢将主题转到HDFS的EC上来.不管是连续存储方式也好,还是EC的条带式存储,其实都是属于Block Layout布局上面的问题.下面我们来仔细分析这2种方式的布局特点.

连续存储: Contiguous



连续存储方式就是我们平常所熟知的HDFS的文件存储方式,以Block块为单位,如果文件写数据大小超出了1个块,则新创建一个块继续写,知道写完整个数据.整个存储的逻辑结构如下图所示:

上图是标准的128M一个块大小的连续存储图.想要进一步学习HDFS连续存储方面的内容可以查看相关类BlockInfoContiguous,或点击查看我的另外一篇文章HDFS邻近信息块BlockInfoContiguous.

条带式存储: Striping



Stripe在这里的意思就是条带式的意思.我第一次看到HDFS中的条带式存储方式时候,我的第一感觉是这种存储逻辑看起来非常的别扭.虽然说它还是以Block作为一个存储的单元,但是数据是横向式的保存在各个Block上.换句话说,同一个Block上的不同分段的数据是完全不连续的.条带式的存储结构图如下:

在每个Block块中的一个横块,就是上文讲述RS码时的data cell的概念.下面是基于HDFS下的data cell结合parity cell加密块的条带式存储的展示效果图:

上图对应的EC编码类型是RS(6, 3).前面从DataNode0~5总共6个节点存数据块,后面的DataNode6~8存的则是加密块.其实我们可以看到,HDFS EC的独有的条带式的存储方式与原有的存储方式存在着非常大的不同.这势必会带来数据读写方式的改变.而HDFS EC是如何做到其中的适配呢?还有一个问题,HDFS EC下的数据能支持原来的许多的HDFS的一些特性吗,Snapshot?EncryptionZone?HDFS Cache?

HDFS EC的架构设计



前面说了这么多,最后终于要提到HDFS EC的架构设计了.我想这也是很多关注HDFS EC的人想要了解的.EC纠删码技术作为一项数据保护技术,本身存在一定的学习成本,要把它引入到HDFS中,也绝对不是一件简单的事情.要做非常多的适配改造工作.想要了解更加详细的架构设计部分,可以参见社区上的关于HDFS EC的设计文档,链接点进去即可.下面是本人经过浓缩概况后的内容.

数据读写相关类的适配



在之前小节的末尾已经提到过,Striping条带式存储方式的引入会带来数据读写逻辑的转变,所以这里需要引入针对HDFS EC特有的条带式的输入输出数据流的读写类.主要是下图所示的几个类:

通过类名称我们也可以直接看出它是适用于哪一类存储方式的数据读写.这里额外提一下ErasureCodingWork的服务,ErasureCodingWork与ReplicationWork类似,它的作用是将新的待复制的副本块任务分配到对应的DataNode节点上.ErasureCodingWork则对应的是分配EC编码任务到相应的DataNode节点上.

HDFS EC的架构设计



HDFS EC的架构设计同样遵从主从结构,有一个中心的管理对象(ECManager),然后有对应的worker对象(ECWorker).这2大角色类有明确的分工.

ECManager:EC管理对象会做许多事情,比如协调数据恢复,健康检测,blockGroup的管理等等.
ECWorker:做的事情很直接,就是EC数据恢复相关的操作.

那么现在有一个问题,我在做EC数据恢复的时候,如何使用之前的EC编码算法呢?HDFS是通过EC Policy进行控制的,每个EC策略对应一种ECSchema参数配置的EC算法.同时这些EC Policy策略对象被ErasureCodingPolicyManager对象所掌管.目前ErasureCodingPolicyManager对象中维护了以下3种EC策略:

  private static final ErasureCodingPolicy SYS_POLICY1 =
      new ErasureCodingPolicy(ErasureCodeConstants.RS_6_3_SCHEMA,
          DEFAULT_CELLSIZE, HdfsConstants.RS_6_3_POLICY_ID);
  private static final ErasureCodingPolicy SYS_POLICY2 =
      new ErasureCodingPolicy(ErasureCodeConstants.RS_3_2_SCHEMA,
          DEFAULT_CELLSIZE, HdfsConstants.RS_3_2_POLICY_ID);
  private static final ErasureCodingPolicy SYS_POLICY3 =
      new ErasureCodingPolicy(ErasureCodeConstants.RS_6_3_LEGACY_SCHEMA,
          DEFAULT_CELLSIZE, HdfsConstants.RS_6_3_LEGACY_POLICY_ID);

以上几个对象的上下层级关系图如下:

综上所述,最后给出HDFS EC设计文档中的总架构设计图:

EC的使用也是非常的方便,能够通过外部命令的方式直接对指定路径下的数据做EC/Replication之间的灵活装换.还能设置不同path下的不同EC Policy,具体EC的使用同样可以参阅HDFS EC的设计文档.总的来看,HDFS EC将会是一个很实用的功能.

引用


1.http://blog.cloudera.com/blog/2015/09/introduction-to-hdfs-erasure-coding-in-apache-hadoop/

2.https://issues.apache.org/jira/secure/attachment/12697210/HDFSErasureCodingDesign-20150206.pdf

3.百度百科.Reed-Solomon Codes.

时间: 2024-12-21 10:26:34

再聊HDFS Erasure Coding的相关文章

Hadoop Erasure Coding结构分析

前言 Hadoop-3.0-alpha2版本最近已经发布了,在Hadoop-3.0-alpha2版本中,社区继续fix了许多关于HDFS EC特性相关的issue.而Hadoop EC作为3.0版本中具有重大意义的feature,我们非常有必要去学习,并用好这个特性.在之前的文章中,笔者或多或少介绍过EC技术的原理知(再聊HDFS Erasure Coding)以及EC技术在Hadoop中的运用(Hadoop 3.0 Erasure Coding 纠删码功能预分析).最近笔者重新阅读.学习了EC

Hadoop 3.0 Erasure Coding 纠删码功能预分析

前言 HDFS也可以支持Erasure Coding功能了,将会在Hadoop 3.0中发布,可以凭图为证: 在HDFS-7285中,实现了这个新功能.鉴于此功能还远没有到发布的阶段,可能后面此块相关的代码还会进行进一步的改造,因此只是做一个所谓的预分析,帮助大家提前了解Hadoop社区目前是如何实现这一功能的.本人之前也没有接触过Erasure Coding技术,中间过程也确实有些偶然,相信本文可以带给大家收获. 巧遇Hadoop 3.0 Erasure Coding 第一次主动去了解eras

再理解HDFS的存储机制

再理解HDFS的存储机制 1. HDFS开创性地设计出一套文件存储方式,即对文件分割后分别存放: 2. HDFS将要存储的大文件进行分割,分割后存放在既定的存储块(Block)中,并通过预先设定的优化处理,模式对存储的数据进行预处理,从而解决了大文件储存与计算的需求: 3. 一个HDFS集群包括两大部分,即NameNode与DataNode.一般来说,一个集群中会有一个NameNode和多个DataNode共同工作: 4. NameNode是集群的主服务器,主要是用于对HDFS中所有的文件及内容

再聊移动端页面的适配

再聊移动端页面的适配 https://www.w3cplus.com/css/vw-for-layout.html  原文网址 Flexible承载的使命 Flexible到今天也有几年的历史了,解救了很多同学针对于H5页面布局的适配问题.而这套方案也相对而言是一个较为成熟的方案.简单的回忆一下,当初为了能让页面更好的适配各种不同的终端,通过Hack手段来根据设备的dpr值相应改变<meta>标签中viewport的值: <!-- dpr = 1--> <meta name=

VB.NET小结——再聊面向对象

学完VB.NET,很大的一个感受就是,以前觉得台湾话挺好玩儿的,但是,现在,只想说:爸比,一点儿都不酷啊~..Just kidding~~~ VB.NET主要分为两部分,一部分是我看的懂的部分,一部分是看不懂的. 看的懂的部分一部分是面向对象的那一部分,对于这一部分,由于有以前VB,C#,c++的基础,理解起来并不难.VB.NET在语法上很像VB,连一些常用控件的方法都没有改变,用起来很容易上手,在面向对象上,VB.NET比较像C#,简单的单继承,因此不用考虑会不会出现出现多继承中二义性问题,而

11年之后再聊程序员的人生

突然找到了在大学时候的cnblog网页,里面写了四篇人生感悟的日记. 说实在的11年前的自己,感情很真,对人生充满盼望,青春真好. 这11年来的程序员生活,可以归结为学习技术.崇拜技术.藐视技术.无奈地身陷技术之中... 刚毕业的时候对网络和计算机充满好奇,学校里面学习的flash.photoshop.tcp/ip.html一些浅薄的知识在产品开发的实践中变得毫无用处, 于是开始学习技术,遇到了好的导师耐心地指导,遇到了好的公司让我潜心分析嵌入式操作系统.linux内核驱动.CPU精简指令集.

再聊线程池

引言 最近恰好在组内分享线程池,又看了看四年前自己写的线程池文章,一是感叹时光荏苒,二是感叹当时的理解太浅薄了,三是感叹自己这么多年依然停留在浅薄的理解当中,没有探究其实现,羞愧难当.遂把分享的内容整理出来,希望能够让读者对线程池有一个全新的认识. 池化 这里池化并不是深度学习中的池化,而是将资源交给池来管理的这一过程.我们在开发中经常回接触到池化资源的技术,最常见的当然是数据库连接池,以及我们今天要讲的线程池,那这种池化资源的特点和好处是什么呢? 特点 通常管理昂贵的资源,如连接.线程等 资源

再聊清除浮动

浮动(float),一个我们即爱又恨的属性.爱,因为通过浮动,我们能很方便地布局: 恨,浮动之后遗留下来太多的问题需要解决,特别是IE6-7(以下无特殊说明均指 windows 平台的 IE浏览器).也许很多人都有这样的疑问,浮动从何而来?我们为何要清除浮动?清除浮动的原理是什么?本文将一步一步地深入剖析其中的奥秘,让浮动使用起来更加得心应手. 一.清除浮动 还是 闭合浮动 (Enclosing float or Clearing float)?很多人都已经习惯称之为清除浮动,以前我也一直这么叫

再聊 cocos2dx -quick 适配

适配原理:同比例缩放. 因为只有宽和高同比例缩放,才会 1 图片不会变形 2 在逻辑上构成的长宽坐标的比例才会一致.比如 宽 2pt代表4个像素,高2pt代表4个像素,不会出现相同的逻辑长度实际代表的像素长度是不同的. 比如: 适配主要是针对背景图片和ui元素. 1 一张背景图片 宽960像素 高480像素.我想让这张图片在设备垂直方向上完全填满显示.通过缩放可以做到.也一定可以获得一个缩放的比例值 r,也就是 图片高度/设备高度 .为什么要求在垂直方向上填满设备?因为我这里的目的是想让某些布局