本文结合hadoop : the definitive guide精心而作,包含作者的心血,希望可以帮助大家理解一点hdfs的皮毛,足矣。(charles@xingbod.cn)


hadoop本身自带原始的数据IO操作,包括数据处理的完整,压缩等等。但是面对大数据集,还是需要特殊考虑,还包含hadoop tools中的一些组件,例如序列化框架,硬盘数据存储结构等。

因为数据要在HDFS中分散多处,那么,数据其实不应该有丢失或者损坏。但是,每个磁盘或者网络IO都有可能对读写操作引入错误,但数据变得更大。叠加起来的概率就会更加高。磁盘读写错误率与磁盘本身的状态有关,网络延迟或者故障等也会导致网络IO错误。

如果很难感受IO错误概率的影响,我们可以做一个简单的计算:

假设我们每一次的IO流量是1MB,每一次出现的概率是很低很低的,假设为1/10^7 对于普通磁盘和网络IO大概可以达到这个概率,平常用户单一操作并不会产生什么影响。当时大数据集处理500GB的时候,出现错误的概率:

R=1-(1-10^7)^500*1024=5%

由此可见,在我们传输500GB的时候,有5%的概率产生IO错误。

因此大数据处理的时候就应该仔细考虑这个问题。我们面临的不只是500GB,可能是500TB或者更多海量的数据。IO操作中对数据的校验操作是解决这个问题的一个不可或缺的方法。

常用的做法是在第一次进入系统的时候计算数据校验和。校验和(Checksum)是冗余校验的一种形式。 它是通过错误检测方法,对经过空间(如通信)或者时间(如计算机存储)传送的数据的完整性进行检查的一种简单方法。计算机领域常见的校验和的方法有循环冗余校验(CRC)、MD5、SHA家族等。当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。


例如上图,节点1和节点2之间进行文件传输,node1写文件到Node2,Node2收到数据的时候就会进行校验,如果Node1中的checksum和Node2中的不一样,就说明文件传输中被损坏,就会马上抛出checksum exception.这个checksum excepion属于IOException的一个子类。

每一校验的文件的大小默认是512字节,这是由系统默认设置的,也可以人工设置为其他的值(io.bytes.per.checksum).


以上的例子是节点之间或者客服端可节点之间的网络传输的校验。另外一个校验的地点发生在数据节点上面,也就是节点本地系统。数据节点data node维护一个连续的校验和验证日志,他知道每个数据块最后的验证时间,出了与client进行验证,每个节点还会在后台运行datablockscanner,这个程序用来检验存在节点上的所有的数据块,防止bit rot的产生。

bit rot在这里指的是,存储在磁盘中的 数据的 性能和完整性的缓慢变化。

由于HDFS存在至少三个副本,在client进行数据操作,发现数据块校验失败之后,抛出checksu exception,就会报告这个数据块以及他的这个数据节点,名称节点会标记这个 节点上的这个数据块为损坏,组织进行修复。

在本地文件系统里面的校验和是怎么体现出来的呢?校验和保存在哪里?校验和对应的数据块大小改变了怎么办?

其实在hdfs中,在同一个文件夹下面包含每一个文件的校验和,譬如:
文件的名字是filename,
那么
校验文件就是.filename.crc

校验文件包含校验值以及校验文件的大小等信息。因此即使系统中的文件块大小改变,还是可以通过校验文件,读取到校验码对应的文件块大小以及文件块。

当然,除了校验文件保证文件没有出现错误之外,我们还要考虑另外一个问题,大量的数据导致大量的存储需求,因此我们面临着压缩和解压缩,编码和解码的需求压力。hadoop要怎么解决这个问题,下一篇文章我会用代码来说明这个问题。

文件校验以后有机会也会贴出源代码讨论,看机缘吧。


Charles 于2015-12-21 Phnom Penh



版权说明:
本文由Charles Dong原创,本人支持开源以及免费有益的传播,反对商业化谋利。
CSDN博客:http://blog.csdn.net/mrcharles
个人站:http://blog.xingbod.cn
EMAIL:charles@xingbod.cn

Hadoop IO 特性详解(1)【数据完整性】的更多相关文章

  1. Hadoop IO 特性详解(2)

    (本文引用了microheart,ggjucheng的一些资料,在此感谢.charles觉得知识无价,开源共享无价) 这一次我们接着分析文件IO校验的相关代码,看看最底层是如何实现这种大数据集的文件校 ...

  2. Hadoop IO 特性详解(2)【文件校验】

    (本文引用了microheart,ggjucheng的一些资料,在此感谢.charles觉得知识无价,开源共享无价) 这一次我们接着分析文件IO校验的相关代码,看看最底层是如何实现这种大数据集的文件校 ...

  3. Hadoop IO 特性详解(1)

    本文结合hadoop : the definitive guide精心而作,包含作者的心血,希望可以帮助大家理解一点hdfs的皮毛,足矣.(charles@xingbod.cn) hadoop本身自带 ...

  4. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  5. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  6. 点击--》java9 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  7. java10 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  8. hadoop基础-SequenceFile详解

    hadoop基础-SequenceFile详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SequenceFile简介 1>.什么是SequenceFile 序列文件 ...

  9. Hadoop RPC机制详解

    网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...

随机推荐

  1. 第三方模块requests下载

    requests下载 英文网站 http://docs.python-requests.org/en/master/ 中文网站 http://docs.python-requests.org/zh_C ...

  2. python collections模块 之 defaultdict

    defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持.但它与 dict 最大的区别在于,如 ...

  3. POJ 2318 /// 判断点与直线的位置关系

    题目大意: n块玩具箱隔板 m个玩具落地点 给定玩具箱的左上和右下两个端点 接下来给定n块隔板的上点的x和下点的x(因为y就是玩具箱的上下边缘) 接下来给定m个玩具落地点 输出n+1个区域各有的玩具数 ...

  4. Java之实现多线程

    保证同步的几种方法: (1) 同步方法,synchronized 关键字修饰方法.由于Java中的每个对象都有一个内置锁,当用该关键词修饰时,内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则 ...

  5. telnet- Linux必学的60个命令

    1.作用 telnet表示开启终端机阶段作业,并登入远端主机.telnet是一个Linux命令,同时也是一个协议(远程登陆协议). 2.格式 telnet [-8acdEfFKLrx][-b][-e] ...

  6. 显示和隐藏(display属性)none或block

    显示和隐藏(display属性) 网页中经常会看到显示和隐藏的效果,可通过display属性来设置. 语法: Object.style.display = value 注意:Object是获取的元素对 ...

  7. SDOI2018Round1 && 九省联考 爆炸记

    Day 0 做了一上午火车,大概中午十二点左右到了烟台核电培训中心宾馆,宾馆蛮不错的,跟我在北京参加英才论坛时住的宾馆舒适程度上差不多. 下午花式颓颓颓,吃了晚饭(体验一般)去试机,听说用Lemon评 ...

  8. mysql 表查询结果 总行数计算

    一般的查询语句是这样的 SELECT  id,name FROM SystemEvents WHERE  1=1 limit 9,10 SELECT  * FROM SystemEvents WHER ...

  9. about how to determine a prime number

    (1) if divided by 2 or 3, then no; (2) we only have to go through prime factors; because a composite ...

  10. Python基础笔记_变量类型

     下面是W3C学习笔记 , , ) :] ]) :]) :]) :-]) :-]) ]) :]) :]) ) , , ]) :]) :]) ) , , , ]) :]) :]) ) ] = , ])) ...