HADOOP如何保证数据的正确性保证
2010-07-18 23:11
281 查看
在复杂纷繁的分布式环境中,
我们坚定的相信,万事皆有可能。哪怕各个服务器都舒舒服服的活着,也可能有各种各样的情况导致网络传输中的数据丢失或者错误。并且在分布式文件系统中,同
一份文件的数据,是存在大量冗余备份的,系统必须要维护所有的数据块内容完全同步,否则,一人一言,不同客户端读同一个文件读出不同数据,用户非得疯了不
可。。。
在HDFS中,为了保证数据的正确性和同一份数
据的一致性,做了大量的工作。首先,每一个数据块,都有一个版本标识,在Block
类中,用一个长整型的数generationStamp
来
表示版本信息(Block类是所有表示数据块的数据结构的基类),一旦数据块上的数据有所变化,此版本号将向前增加
。
在主控服务器上,保存有此时每个数据块的版本,一旦出现数据服务器上相关数据块版本与其不一致,将会触发相关的恢复流程。这样的机制保证了各个数据服务器
器上的数据块,在基本大方向上都是一致的。但是,由于网络的复杂性,简单的版本信息无法保证具体内容的一致性(因为此版本信息与内容无关,可能会出现版本
相同,但内容不同的状况)。因此,为了保证数据内容上的一致,必须要依照内容,作出签名
。。。
当客户端向数据服务器追加写入数据包时,每一个
数据包的数据,都会切分成512字节
大小的段,作为签名验证的基本单位,在HDFS中,把这个数据段称为Chunk,
即传输块
(注意,在GFS中,Chunk表达的是数据块...)。在每一个数据包中,都包含若干个传输块以及每一个传输块的签名,当
下,这个签名是根据Java SDK提供的CRC
算法算得的,其实就是一个奇偶校验。当数据包传输到流水线的最
后一级
,数据服务器会对其进行验证(想一想,为什么只在最后一级做验证,而不是每级都做...),一旦发现当前的传输块签名与在客户端
中的签名不一致,整个数据包的写入被视为无效,Lease Recover(租约恢复)算法
被触发。。。
从基本原理上看,这个算法很简单,就是取
所有数据服务器上此数据块的最小长度当作正确内容的长度,将其他数据服务器上此数据块超出此长度的部分切除
。从正确性上看,此算法无疑
是正确的,因为至少有一个数据服务器会发现此错误,并拒绝写入,那么,如果写入了的,都是正确的;从效率上看,此算法也是高效的,因为它避免了重复的传输
和复杂的验证,仅仅是各自删除尾部的一些内容即可。但从具体实现上来看,此算法稍微有些绕,因为,为了降低本已不堪重负的主控服务器的负担,此算法不是由
主控服务器这个大脑发起的,而是通过选举一个数据服务器作为Primary
,由Primary发起,通过调用与其他各
数据服务器间的InterDatanodeProtocol
协议,最终完成的。具体的算法流程,参见LeaseManager
类
上面的注释。需要说明的是此算法的触发时机和发起者。此算法可以由客户端
或者是主控服务器
发
起,当客户端在写入一个数据包失败后,会发起租约恢复。因为,一次写入失败,不论是何种原因,很有可能就会导致流水线上有的服务器写了,有的没写,从而造
成不统一。而主控服务器发起的时机,则是在占有租约的客户端超出一定时限没有续签,这说明客户端可能挂了,在临死前可能干过不利于数据块统一的事情,作为
监督者,主控服务器需要发起一场恢复运动,确保一切正确。。。
我们坚定的相信,万事皆有可能。哪怕各个服务器都舒舒服服的活着,也可能有各种各样的情况导致网络传输中的数据丢失或者错误。并且在分布式文件系统中,同
一份文件的数据,是存在大量冗余备份的,系统必须要维护所有的数据块内容完全同步,否则,一人一言,不同客户端读同一个文件读出不同数据,用户非得疯了不
可。。。
在HDFS中,为了保证数据的正确性和同一份数
据的一致性,做了大量的工作。首先,每一个数据块,都有一个版本标识,在Block
类中,用一个长整型的数generationStamp
来
表示版本信息(Block类是所有表示数据块的数据结构的基类),一旦数据块上的数据有所变化,此版本号将向前增加
。
在主控服务器上,保存有此时每个数据块的版本,一旦出现数据服务器上相关数据块版本与其不一致,将会触发相关的恢复流程。这样的机制保证了各个数据服务器
器上的数据块,在基本大方向上都是一致的。但是,由于网络的复杂性,简单的版本信息无法保证具体内容的一致性(因为此版本信息与内容无关,可能会出现版本
相同,但内容不同的状况)。因此,为了保证数据内容上的一致,必须要依照内容,作出签名
。。。
当客户端向数据服务器追加写入数据包时,每一个
数据包的数据,都会切分成512字节
大小的段,作为签名验证的基本单位,在HDFS中,把这个数据段称为Chunk,
即传输块
(注意,在GFS中,Chunk表达的是数据块...)。在每一个数据包中,都包含若干个传输块以及每一个传输块的签名,当
下,这个签名是根据Java SDK提供的CRC
算法算得的,其实就是一个奇偶校验。当数据包传输到流水线的最
后一级
,数据服务器会对其进行验证(想一想,为什么只在最后一级做验证,而不是每级都做...),一旦发现当前的传输块签名与在客户端
中的签名不一致,整个数据包的写入被视为无效,Lease Recover(租约恢复)算法
被触发。。。
从基本原理上看,这个算法很简单,就是取
所有数据服务器上此数据块的最小长度当作正确内容的长度,将其他数据服务器上此数据块超出此长度的部分切除
。从正确性上看,此算法无疑
是正确的,因为至少有一个数据服务器会发现此错误,并拒绝写入,那么,如果写入了的,都是正确的;从效率上看,此算法也是高效的,因为它避免了重复的传输
和复杂的验证,仅仅是各自删除尾部的一些内容即可。但从具体实现上来看,此算法稍微有些绕,因为,为了降低本已不堪重负的主控服务器的负担,此算法不是由
主控服务器这个大脑发起的,而是通过选举一个数据服务器作为Primary
,由Primary发起,通过调用与其他各
数据服务器间的InterDatanodeProtocol
协议,最终完成的。具体的算法流程,参见LeaseManager
类
上面的注释。需要说明的是此算法的触发时机和发起者。此算法可以由客户端
或者是主控服务器
发
起,当客户端在写入一个数据包失败后,会发起租约恢复。因为,一次写入失败,不论是何种原因,很有可能就会导致流水线上有的服务器写了,有的没写,从而造
成不统一。而主控服务器发起的时机,则是在占有租约的客户端超出一定时限没有续签,这说明客户端可能挂了,在临死前可能干过不利于数据块统一的事情,作为
监督者,主控服务器需要发起一场恢复运动,确保一切正确。。。
相关文章推荐
- 关于ETL过程如何保证数据量的准确性和数据的正确性的讨论
- 关于ETL过程如何保证数据量的准确性和数据的正确性的讨论
- 浅析支付平台数据正确性保证
- 《LoadRunner没有告诉你的》之七——使用 LoadRunner 连续长时间执行测试,如何保证参数化的数据足够又不会重复?
- 如何避免Hadoop streaming 自动给单行数据加tab
- 面试问题(如何保证分布式数据最终一致性)
- 如何在美国公司写project plan 邮件--以hadoop安装和Mahout数据分析为例子
- [大数据新手上路]“零基础”系列课程--如何将ECS上的Hadoop数据迁移到阿里云数加·MaxCompute
- [one day one question] Vue单页面应用如何保证F5强刷不清空数据
- 网络中数据如何保证数据的安全性?
- 《LoadRunner没有告诉你的》之七——使用 LoadRunner 连续长时间执行测试,如何保证参数化的数据足够又不会重复?
- 如何保证数据的安全性
- 大数据之路-Hadoop-1-如何识别hadoop是32位还是64位
- 想入行大数据,如何才能学好Hadoop?
- 如何保证云服务供应中的数据安全?
- TCP是如何保证可靠数据传输的?
- javaEE+大数据-Hadoop平台如何优化
- 如何保证向两个服务器插入数据能同步
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
- 如何挑选合适的大数据或Hadoop平台?