[关闭]
@zqbinggong 2018-06-02T15:28:26.000000Z 字数 1481 阅读 826

Hadoop的I/O操作

hadoop 《权威指南》

! All pictures are screenshots from the book 'Hadoop: The Definitive Guide, Fourth Edititon, by Tom White(O'Reilly).Copyright©2015TomWhite, 978-1-491-90163-2'


数据完整性

如果系统中需要处理的数据量大到hadoop的处理极限时,数据被损坏的概率还是很高的
1. 检测数据常见的措施是,在数据第一次引入系统时,计算数据的校验和(checksum)并在数据通过一个不可靠的通道进行传输后再次计算校验和
2. 常用的错误检测码是CRC-32(32位循环冗余检验),hdfs用的是变体CRC-32C

HDFS的数据完整性

  1. HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和(存储校验和的额外开销小于1%)
    • datanode负责在收到数据后存储在数据及其校验和之前对数据进行验证(管线中的最后一个datanode负责验证校验和)
    • 客户端从datanode读取数据时,也会验证校验和,并将其与dn中的进行验证,验证成功后,会告诉dn,dn由此更新它所持久保存的用于验证的校验和日志
    • 除此之外,dn会在一个后台线程中运行一个DataBlockScanner,从而定期验证存储在这个dn上的所有数据块
  2. 修复过程:
    • 客户端读取时检测到错误,首先向namenode报告这个错误的数据块以及datanode
    • namonode将这个数据块复本标记为已损坏,然后安排这个数据块的一个复本复制到另一个dn
    • 删除这个损坏的数据块
  3. 在使用open方法读取文件之前,将false值传给FileSystem对象的setVerifyChecksum方法,可以禁用校验和验证

LocalFileSystem

hadoop的LocalFileSystem执行客户端的校验和验证

ChecksumFileSystem

LocalFileSystem通过ChecksumFileSystem完成自己的任务


压缩

文件的压缩有两个好处:减少存储所需的磁盘空间,并加速数据在网络的磁盘上的传输


序列化

  1. 序列化是指将结构化对象转化为字节流以便在网络上传输或者写到硬盘进行永久花存储的过程;反序列化即它的反过程
  2. 序列化用于分布式数据处理的两大领域: 进程通信和永久存储
  3. 在hadoop中,系统中对个节点上进程间的通信是通过RPC实现的,RPC序列化的格式如下:
    • 紧凑
    • 快速
    • 可扩展
    • 支持互操作
  4. PRC序列化格式的四大理想属性对持久存储格式而言也很重要
  5. hadoop使用自己的序列化格式Writable

Writable接口


基于文件的数据结构

所谓基于文件,指的是选择合适的文件类型来存储数据,比如说使用纯文本文件存储小说。
对于基于MR的数据处理,将每个二进制数据大对象(blob)单独放在各自的文件中不能实现可扩展性,因此hadoop开发了很多更高层次的容器

SequenceFile

  1. 为二进制键-值对提供了一个持久数据结构,
  2. 也可以作为小文件的容器,HDFS和MR是针对大文件优化的,所以通过SequenceFile类型将小文件包装起来,可以获得更高效的存储和处理
  3. 具体操作:

关于MapFile

MapFile是已经排序过的SequenceFile,他有索引,可以之间按键查找
1. 索引自身就是一个SequenceFile,包含了map的一部分键(默认是每个128个键),由于索引可以加载进内存,因而可以提供随主数据文件的快速查找
2. 主数据文件时另一个SequenceFile,包含了所有的map条目(已经排序)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注