图片 2

Hadoop RAID Node 调研

ErasureCode有两种实现:

图片 1

能被恢复的丢失的字节的个数等于被创建的parity字节的个数。比如,我们把10个source字节编码成3个parity字节,我们能通过剩下的10个字节来恢复任意3个丢失的字节。

目前,HDFS Raid采用了XOR和RS(Reed-Solomon)两种编码方式。

当前BlockFixer有两种实现:

熟悉传统Raid的朋友都知道”分条”(stripe)技术,HDFS
Raid中也借用了这个概念,它把文件每X个Block作为一个stripe来进行编码校验,其中X就是stripe
length。比如,一个文件/foo/bar有16个Block,stripe
length是10的话,该文件就有2个stripe。每个stripe是一个独立的编码校验单元,编解码都是以stripe为单位的。上面提到的那个文件,第1-10块作为stripe1进行编码,第11-16块作为stripe2进行编码,生成stripe1的编码校验不需要stripe2中的Block参与,反之亦然。

DistributedRaidNode:分配MapReduce任务来计算parity块。

图片 2

Ubuntu下Hadoop环境的配置
http://www.linuxidc.com/Linux/2012-11/74539.htm

XOR编码相对而言比较简单,纠错能力也弱一些。它采用异或算法生成校验码parity,每个stripe只生成1个parity,对应上面的/foo/bar文件,两个stripe就会有两个parity
Block,这两个parity
Block组成一个parity文件/raidxor/foo/bar。在每个Block一个副本的情况下,如果某个stripe中丢失或者损坏了一个Block,通过XOR是可以将它恢复出来的,但是大于一个就不行了。

DRFS client作为DFS
client之上的一软件层,拦截所有进来的请求并传它们传递给下边的客户端。当下边的DFS抛出ChecksumException或BlockMissingException异常,DFS
client捕获这些异常,定位当前source文件的parity文件,并在返回丢失的块给应用前将它们重新计算。

图片 3

运行以下命令可以检验文件系统的完整性:

RS编码实现比较复杂,但是纠错能力较强,被广泛用于各种商业用途,比如CD,DVD和通信协议WiMAX。它的特点在于允许用户自定义parity长度(parity
len)来达到压缩和可靠性的平衡。如果parity len = 4,会生成四个parity
Block,组成/raidrs/foo/bar文件。它能够容忍同一stripe中同时丢失4个Block还能将恢复出来。HDFS
Raid也主要采用这种编码方式。

DRFS总体架构(Distributed Raid File System)

需要注意的是,HDFS Raid建议将同一stripe的Block(包括parity
Block)分散放置在不同的datanode上,这样避免某个datanode发生故障时,影响对这些Block的恢复,这个道理跟采用冗余备份时不能将同一Block的三个副本放在同一个datanode上的道理是一样的。

HDFS的主要不足之一是每份数据要复制在三个地方,当今,磁盘存储越来越便宜,这是可以接受的,相对于小型或中型规模的机群,这并不是一个问题。使用15块磁盘和10块磁盘的价格差距并不大。假设每GB数据的成本为$1,那么15块1TB磁盘和10块1TB磁盘的价格差只是$5k。但如果机群的总数据量是10PB的话,那么将数据存储在两个地方而不是三个,节省的成本是$10,000,000!

我们知道,Raid技术能够通过纠错编解码来实现文件存储的可靠性。一个磁盘的数据发生损坏,可以通过纠错编解码来恢复该数据。虽然它也会产生多余的校验码parity,但是原数据本身并不会存成多份。作为另外一种提高可靠性的理念,Raid技术也被引入到了分布式文件系统中,Google新一代文件系统Colossus便采用了Raid技术(Reed-Solomon纠错编解码)实现了更经济的可靠性,FaceBook也开源了自己基于Hadoop
HDFS的Raid实现(),Hadoop社区对HDFS
Raid也有专门的介绍()。接下来,我们来介绍一下HDFS
Raid相关的情况。

更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

  • 冗余方式(tarRepl=3): 文件损坏概率=O(p^3),
    空间占有率=300%
  • Raid RS: 文件损坏概率=O(p^(parity+1)),
    空间占有率=(100*(targetRepl*N +
    math.ceil(N*1.0/stripe)*metaRepl*parity)/N) % = (targetRepl +
    math.ceil(N*1.0/stripe)*metaRepl*parity/N)*100 %.
    假设我们需要将文件损坏概率至少降低一个数量级,则parity>=3。空间占有率相关的参数较多,我们来取下面的几个值:

    • 由parity=3, targetrep=1,
      metaRepl=1, stripe=10, N=5得到,空间占有率=160%   
    • 由parity=3, targetrep=1,
      metaRepl=1, stripe=10, N=10得到,空间占有率=130%
    • 由parity=3, targetrep=2,
      metaRepl=1, stripe=10, N=5得到,空间占有率=260%
    • 由parity=3, targetrep=2,
      metaRepl=1, stripe=10, N=10得到,空间占有率=230%

ErasureCode是被BlockFixer和RaiNode用来生成parity块和修改parity/source块的一组件,ErasureCode实现编码和解码。当在编码时,ErasureCode取几个source字节并生成一些parity字节。当在解码时,ErasureCode通过剩余的souce字节和parity字节来生成丢失的字节。

首先,HDFS
Raid是以文件为粒度进行的空间压缩方式,它能够在保证可靠性的前提下有效地减少文件占用HDFS存储空间的大小。

HDFS使用3副本是因为它使用商用机器以及磁盘有不可忽略的出现故障的机率。据观测,在实践中使用3副本已经足以保证不丢失数据。现在的挑战是要保持真实的副本数接近2而有效副本数是3。Erasure
Codes是最好的实现方案。

在分布式文件系统中,为了提高文件存储的可靠性,一般采用文件分Block的方法,并把每个Block的多个副本分别存储在不同的服务器上,Hadoop开源的分布式文件系统HDFS同样采用了这样的技术。但是,这样的方式会造成空间较大的浪费,HDFS每个文件的Block会有三个副本,如果文件大小为120MB,Block大小为64MB,则需要该文件会有两个Block,每个Block有三个副本,就是说一个120MB的文件会耗费360MB的HDFS存储空间(64MB*3+56MB*3),需要3倍于原文件大小的存储空间(300%)。随着HDFS集群的不断扩大,需要更多的磁盘来存储这些文件块的副本。如果一个HDFS集群达到下图所示的规模,可能任何一个公司都要考虑一下是不是该采用其他技术来弥补多副本造成的空间浪费了。

RaidShell是一个允许管理维护和检查DRFS的工具,支持手动触发重新计算坏数据块的命令,允许管理查看不可修复文件列表。

更多Hadoop相关信息见Hadoop
专题页面
http://www.linuxidc.com/topicnews.aspx?tid=13

1)    DRFS client

下面对冗余备份和Raid(RS编码)进行比较: (N=文件的Block数,
p为单个块的损坏概率, stripe=原文件每多少块做一个stripe,
parity=每个stripe有多少个parity Block, tarRepl=目标文件的副本数,
metaRepl=parity文件的副本数,空间占有率=目标文件及parity文件所占空间/原文件所占空间*100%)

1.    简介

DRFS的主要好处是增加针对数据损坏的保护,有了这样的保护,可以采用更低的副本数来保持同样的可用性保障,将会节省很大的存储空间。

LocalBlockFixer:在RaidNode本地重新计算损坏的块;

上述是在2009年的数据,如今磁盘存储的成本已不到¥1/GB了。

图片 4

搭建Hadoop环境(在Winodws环境下用虚拟机虚拟两个Ubuntu系统进行搭建)
http://www.linuxidc.com/Linux/2011-12/48894.htm

HDFS
RAID模块提供一个使用Hadoop分布式系统(DFS)的分布式Raid文件系统(DRFS),在DRFS中存储的文件被分成多个由块组成的stripe。对于每个stripe,若干parity(校验)块存储在与源文件对应的parity文件中。这使得当源文件或parity文件中的块丢失或损坏进可以重新计算并恢复成为可能。

当前RaidNode有两种实现:

HDFS RAID的工作源自Facebook。首先,看看HDFS RAID的作者之一Dhruba
Borthakur在2009年发表的博文的一部分。

DistBlockFixer:分配MapReduce任务来重新计算块。

Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)
http://www.linuxidc.com/Linux/2013-01/77681.htm

LocalRaidNode:在RaidNode本地计算parity块,因为计算parity块是一个计算密集型任务,所以这种方法的可扩展性受到限制;

发表评论

电子邮件地址不会被公开。 必填项已用*标注