HDFS-RAID原理和实现
HDFS-RAID 是Facebook基于hadoop-20-append分支(第一代Hadoop)开发的raid方案,对HDFS的修改极少,主要包括为NameNode增加了根据block信息找到block所属文件的接口。RAID的基本知识和目前社区的方案对比见这,本文重点分析HDFS-RAID的原理和实现。
业界常用的编码方式包括Reed-Solomon(RS),XOR,他们本质上都是对N个数据块就行运算,产生K个校验块。这N+K个块可以同时最多容忍K个块的丢失,丢失的块可以从其余的块中的任意N个恢复出来。在HDFS-RAID里面,N叫做stripeLength,K叫做parityLength。在对数据块和校验块的组织上,HDFS-RAID提供了两种方式:
- 每个数据文件对应一个校验文件,对数据文件的连续stripeLength个block进行编码,产生parityLength个parity block,多个parity block组成parity文件存储在HDFS上。例子:stripeLength=3,parityLength=2,数据文件有6个block,那么对这个数据文件做raid会产生4个parity block,这四个parity block被连接起来组成parity文件。数据文件和parity文件的存放路径存在一定的规则,根据配置决定.
- 数据block可以从不同的数据文件中抽取进行组合,这种方式下,就不存在数据文件和parity文件的一一对应关系,这样的组合用StripeInfo表示,里面包括:数据块列表,校验块列表,编码方式。并且为了容错,这个信息需要持久化,实现中,这个信息可以以多个文件的形式存在本地硬盘(LocalStripeStore)上,也可以存在RDBMS(DBStripeStore)中。值得注意的是,在对某个block进行恢复的时候,需要根据corrupt block信息从StripeStore中取出用于恢复的stripeLength个block,而读取这些block的数据需要拿到block所在的文件名等信息才能读取,而NameNode不提供block到file的接口,所以HDFS-RAID为了NameNode增加了这样的接口。
HDFS-RAID主要由三个模块组成,一个包装了DistributedFileSystem的DistributedRaidFileSystem,一个是RaidNode进程,另外一个RaidShell命令行工具。
DistributedRaidFileSystem
DistributedRaidFileSystem基于DistributedFileSystem,是一种FilterFileSystem,在DistributedFileSystem读数据抛出BlockMissingException或者ChecksumException一场时,会构造
DecoderInputStream,构造的过程中,会做block fix过程,找到stripeLength个数据块,启动几个线程同时读取这几个数据块,decode完成将修复的block数据放入buf中,上层即可以进行读取。
应用使用DistributedRaidFileSystem需要在hdfs-site.xml中设置:
<property>
<name>fs.hdfs.impl</name>
<value>or g.apache.hadoop.dfs.DistributedRaidFileSystem</value>
</property>
其他配置见wiki
RaidNode
编码
RaidNode的TriggerMonitor线程根据配置的策略(PolicyInfo)不断的选择符合RAID条件的文件,然后做RAID。做RAID有两种方式,一种是单机(LocalRaidNode),另外一种是分布式(DistRaidNode),利用MapReduce Job。HDFS-RAID中有一个encodingUnit的概念,它是做RAID的单位,默认是1。以分布式做RAID为例,假设stripeLength=3, parityLength=1,encodingUnit=2, TriggerMonitor选出了两个文件a和b,文件a有6个block, b有12个block,可以得出,a有6/3=2个stripe,b有12/3=4个stripe, encodeingUnit=2代表2个stripe作为一个unit,unit用EncodingCandidate表示,这个例子会产生三个EncodingCandidate。每个EncodingCandidate作为mapper的key,相应的PolicyInfo作为value写入Job的Input文件_distRaid.op.list(Job目录下)中作为一行。输入文件由DistRaidInputFormat来解析。Mapper类是DistRaidMapper,map函数就是对输入的EncodingCandidate范围内的stripe做raid。做raid,需要读stripeLength个块数据,生成parityLength个校验块,默认会有4个线程来做读操作,每个线程就是打开数据block所在的文件,并且seek到block的开始offset,然后将数据读入readbuf中,每个block对应一个readbuf,同时有parityLength个writebuf,用于存编码完成的parity块。最后将生成的parity块连成一个parity file。为了更安全,HDFS-RAID有一个ChecksumStore的概念,开启后,会将数据block和校验block的crc都存入ChecksumStore中,后续如果发现有block损坏,进行修复完成后,从ChecksumStore中取出以前block的crc进行比对,如果相等,说明恢复无误,然后选择一个DataNode将恢复的block发送过去。
采用RAID方式后,为了提高可用性,尽量不在同一个机器上存储属于同一个stripe group的两个block,PlacementMonitor线程用来做这个。
修复
BlockIntegrityMonitor用来定期检测corrupt的file,并进行修复。同样,修复block有分布式和本地修复两种方式。同样,以DistBlockIntegrityMonitor为例,获取corrupt file通过DFSck向NameNode获得,拿到corrupt文件名以及对应的corrupt的块个数后,调用FileCheckRunnable来检查文件是否已经corrupt,这里的corrupt是对DistributedRaidFileSystem而言的,只要corrupt block所在的stripe group(包括stripeLength个数据块和parityLength个parity块)中有至少stripeLength个数据块是好的,那么这个corrupt block就可以恢复,说明这个文件对于DistributeRaidFileSystem来说就是好的,没有corrupt,在这种情况下,会提交一个Job对这些corrupt block进行修复。Mapper是ReconstructionMapper,输入文件的内容是corrupt file。Mapper的map函数拿到corrupt file name,然后进行reconstruct,这块的流程原理和编码差不多,不再赘述。恢复成功block后,选择一个DataNode,给它发送WRITE_BLOCK指令,并把数据发送给它。
策略
主要提供两个配置文件raid.xml和raid-default.xml
raid.xml:
<configuration>
<policy name = "RaidTest1">
// prefix指定的路径下的文件(递归)被扫描检查是否满足RAID条件
<srcPath prefix="/user/foxmailed/raidtest"/>
// 引用raid-default.xml中定义的id
<codecId>xor</codecId>
<property>
<name>targetReplication</name>
<value>1</value>
<description>after RAIDing, decrease the replication factor of a file to this value.</description>
</property>
<property>
<name>metaReplication</name>
<value>1</value>
<description> replication factor of parity file</description>
</property>
<property>
// 一个文件只有2秒没有修改过才有可能被RAID
<name>modTimePeriod</name>
<value>2000</value>
<description> time (milliseconds) after a file is modified to make it a candidate for RAIDing
</description>
</property>
</policy>
// fileList指定的文件每一行的文件是RAID的候选,编码方式引用名为RaidTest1的policy
<policy name = "RaidTest2">
<fileList>/user/foxmailed/fileList.txt</fileList>
<parentPolicy>RaidTest1</parentPolicy>
</policy>
</configuration>
raid-default.xml中主要配置RaidNode支持的编码类型
<configuration>
<property>
<name>raid.codecs.json</name>
<value>
[{
"id" : "rs", //编码id,在raid.xml中用到,用来饮用具体的编码
"parity_dir" : "/raidrs",//校验文件存放的位置
"stripe_length" : 10,
"parity_length" : 4, //10个data block编码生成4个parity block
"priority" : 200,
"erasure_code" : "org.apache.hadoop.raid.ReedSolomonCode", //具体编码类
"description" : "ReedSolomonCode code",
"simulate_block_fix": true
},
{
"id" : "xor",
"parity_dir" : "/raid",
"stripe_length" : 10,
"parity_length" : 1,
"priority" : 100,
"erasure_code" : "org.apache.hadoop.raid.XORCode",
"description" : "XORCode code",
"simulate_block_fix": true
},
{
"id" : "dir-rs",
"parity_dir" : "/dir-raidrs",
"stripe_length" : 10,
"parity_length" : 4,
"priority" : 400,
"erasure_code" : "org.apache.hadoop.raid.ReedSolomonCode",
"description" : "Directory ReedSolomonCode code",
"simulate_block_fix": false,
"dir_raid" : true //目录级别的RAID
}
]
</value>
<description>JSon string that contains all Raid codecs</description>
</property>
</configuration>
实际上,少于2个block的文件不会被RAID。
参考资料
HDFS-RAID原理和实现的更多相关文章
- HDFS RAID实现方案(转)
原文链接:http://blog.chinaunix.net/uid-20196318-id-3213700.html 分布式文件系统主要用于解决海量数据存储的问题,如Goolge.Facebook等 ...
- HDFS 核心原理
HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...
- 一图看懂hadoop分布式文件存储系统HDFS工作原理
一图看懂hadoop分布式文件存储系统HDFS工作原理
- (转)磁盘阵列RAID原理、种类及性能优缺点对比
磁盘阵列RAID原理.种类及性能优缺点对比 原文:http://www.cnblogs.com/chuncn/p/6008173.html 磁盘阵列(Redundant Arrays of Indep ...
- 什么是RAID?RAID有什么用?RAID原理
什么是RAID 硬盘是个很脆弱的东西,它经常会坏掉.所以,为了保证服务器可靠耐用,硬盘必须时时刻刻保持可用.所以有了RAID这个东西.它的目的是将好几个硬盘合并在一起,就算硬盘坏了一个,剩下还有好几个 ...
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...
- 磁盘阵列RAID原理、种类及性能优缺点对比
磁盘阵列(Redundant Arrays of Independent Disks,RAID) 1. 存储的数据一定分片: 2. 分基于软件的软RAID(如mdadm)和基于硬件的硬RAID(如RA ...
- hadoop(二):hdfs HA原理及安装
早期的hadoop版本,NN是HDFS集群的单点故障点,每一个集群只有一个NN,如果这个机器或进程不可用,整个集群就无法使用.为了解决这个问题,出现了一堆针对HDFS HA的解决方案(如:Linux ...
- 【漫画解读】HDFS存储原理(转载)
以简洁易懂的漫画形式讲解HDFS存储机制与运行原理. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下: Client:客户端,系统使用者,调用HDFS API操作文件;与NN交互获取文件元数 ...
- 【转】【漫画解读】HDFS存储原理
根据Maneesh Varshney的漫画改编,以简洁易懂的漫画形式讲解HDFS存储机制与运行原理. 一.角色出演 如上图所示,HDFS存储相关角色与功能如下: Client:客户端,系统使用者,调用 ...
随机推荐
- Apache shiro之身份验证(登陆)流程
从张开涛blog学习后整理:http://jinnianshilongnian.iteye.com/blog/2018398 上图中的类和接口都可以继承和实现来个性化自己的实现. 其中重点看一下Mod ...
- C# 字典排序Array.Sort
Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array ...
- Android Studio开发JNI工程
转:http://www.2cto.com/kf/201412/361768.html 使用Android Sutdio创建一个新的工程后,接下来记录创建NDK工程的基本步骤. 本文将达到: 1. 创 ...
- glow
原则是: 先把原场景渲染到fbo,然后渲染发光的物体 然后叠加,但是问题来了,发光物体是另外一个fbo里渲染的,他没和原场景进行深度测试,导致全部绘制了,叠到一起的时候原先不该显示的部分显示 然后我立 ...
- Selenium关键字驱动测试框架Demo(Java版)
Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html
- 公网IP、私网IP
公网.内网是两种Internet的接入方式.公网接入方式:上网的计算机得到的IP地址是Internet上的非保留地址,公网的计算机和Internet上的其他计算机可随意互相访问. NAT(Networ ...
- ThoughtWorks 2016年第1期DNA活动总结
今天受邀参加了2016年ThoughtWorks公司成都分公司的2016年第一期DNA活动. 什么是DNA? DNA 即 Design And Analysis.设计与分析.这个活动主要是针对产品经理 ...
- js webapp 滑动事件
var startX, startY, endX, endY; $(".detailImg").on("touchstart", touchStart);$(& ...
- WebApp MVC 框架的开发细节归纳
在前文<WebApp MVC,“不一样”的轻量级互联网应用程序开发框架>介绍了WebApp MVC的技术实现以及如何使用,而在本章进一步归纳了使用框架开发的一些细节,也给我们在开发具体功能 ...
- 【cs229-Lecture15】奇异值分解
PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的. 内容: PCA (主成份分析)是一种直接的降维方法,通过求解特征值与特征向量,并选取特征值较大的一些特征向量来达到降 ...