Hadoop:HDFS Raid 介绍男篮世界杯赌球:

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

RAID Node 调研

男篮世界杯赌球 1

1.    简介

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

分布式文件系统主要用于解决海量数据存储的问题,如Goolge、Facebook等大型互联网企业都使用分布式文件系统作为数据存储的基础设施,并在其上构建很多服务,分布式文件系统通常采用三副本的策略来保证数据的可靠性,但随着应用数据量的不断膨胀,三副本策略为可靠性牺牲的存储空间也越来越大,如何在不降低数据可靠性的基础上,进一步降低存储空间成本? Facebook将erasure code应用到内部HDFS集群中,该方案使用erasure code代替传统的三副本策略,在保持集群可用性不变的情况下,节省了数PB的存储空间,Facebook的实现方案(HDFS RAID)目前已贡献给开源社区。

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

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

熟悉传统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参与,反之亦然。

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

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

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

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

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

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

男篮世界杯赌球,作者的想法参考自CMU的DiskReduce,这是一种在HDFS实现erasure codes的方法。HDFS的代码本身就比较复杂,为了不使其变得更加复杂,作者将HDFS Erasure Coding作为HDFS之上的一个软件层,而不是HDFS中的一部分。

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

2.    概况

男篮世界杯赌球 2

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

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

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

  • 冗余方式(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%

架构与实现

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

DRFS总体架构(Distributed Raid File System)

男篮世界杯赌球 3

男篮世界杯赌球 4

Raid是Hadoop mapreduce的一个contrib,Hadoop 0.21.0以上版本就有。

HDFS Raid包含几个软件模块:

  1. DRFS client:为应用提供访问DRFS中文件的接口,当在读文件时能透明地恢复任意损坏或丢失的块;
  2. RaidNode:为存储在DRFS的所有数据文件创建和维护parity文件的后台进程;
  3. BlockFixer:周期性重新计算已经丢失或损坏的块;
  4. Raidshell:允许管理员手动触发丢失或损坏的块的重新计算或检查已遭受不可恢复损坏的文件;
  5. ErasureCode:提供对块中字节的编码及解码。

1)    DRFS client

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

值得注意的是,DRFS client在读到损坏的文件重新计算丢失的块时,并不会将这些丢失的块存到文件系统中,它在完成应用的请求后将其忽略。BlockFixer和RaidShell能用来永远地修改损坏的块。

2)    RaidNode

RaidNode定期扫描配置指定的所有路径,对于每个路径,递归地检查所有拥有超过2个块的文件并选择那些最近(默认是24小时内)没被修改过的文件。一旦选择了一个source文件,它会遍历该文件的所有stripe并为每个stripe创建合适数量的parity块,最后所有的parity块会被合并在一起并存储在与source文件相关的parity文件。RaidNode也会定期删除那些已经孤立或过时的parity文件。

当前RaidNode有两种实现:

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

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

本文由美洲杯赌球发布于计算机教程,转载请注明出处:Hadoop:HDFS Raid 介绍男篮世界杯赌球:

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。