zoukankan      html  css  js  c++  java
  • Hadoop点滴-Hadoop的IO

    1. Hadoop自带一套原子操作用于数据的I/O操作。
    2. 如果系统中需要处理的数据量达到Hadoop的处理极限时,数据被损害的概率还是很高的
    3. 检测数据是否被损害的常见措施是,在数据第一次被引进系统时,计算校验和(checksum),并在数据通过一个不可靠的通道进行传输时,再次计算校验和。
    4. 校验和也是可能损坏的,但由于校验和比数据小得多,所以损坏的可能性非常小
    5. HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。
    6. 默认情况下为512个字节计算校验和,由于CRC-32校验和是4个字节,所以存储校验和的额外开销低于1%
    7. datanode负责在收到数据后存储该数据及其校验和之前对数据进行验证,它在收到客户端的数据或复制其他datanode的数据时执行这个操作。
    8. 正在写数据的客户端将数据及其校验和发送到有一些列datanode组成的管线,管线中最后一个datanode负责验证校验和。如果datanode检测到错误,客户端便会厚道一个IOException异常的一个子类。
    9. 客户端读取datanode数据时,也会验证校验和。
    10. 每个datanode中均持久保存有一个用于验证校验和  日志(persistent log of checksum verification),所有他知道每个数据块的最后一次验证时间。保存这些统计信息对于检测损坏的磁盘很有价值
    11. 不只是客户端在读取数据块时,会验证校验和,每个datanode也会在一个后台线程中运行一个DataBlockScanner。该措施是解决物理存储媒体上损坏的有力措施。
    12. 由于HDFS存储着每个数据块的副本(replica),因此它可以通过副本来修复损害的数据块,进而得到一个新的、完好无损的副本。基本思路是:客户端读取数据块时,如果检测到错误,首先向namenode报告已损坏的数据块及其正在尝试读操作的这个datanode,在抛出ChecksumException。namenode将这个数据块副本标记为已损坏,这样它不再将客户端处理请求直接发送到这个节点,或者尝试将这个复本复制到另一个datanode,如此一来,数据块的副本以腻子(replication factor)又回到期望的水平。
    13. 如果在使用open()方法读取文件之前,将false值传递给FileSystem对象的setVerfiChecksum()方法,即可禁用校验和验证
    14. 可以使用hadoop fs -checksum 来检查一个文件的校验和
    15. 校验和的计算代价是相当低的,java中使用的是本地代码实现的
    16. 压缩:有两大好处,减少存储文件所需要的磁盘空间,并加速数据在网络和磁盘上的传输。这两大好处在处理大量数据时相当重要。
    17. 序列化:用于分布式数据处理的两大领域:进程间通信和永久存储
    18. Hadoop为什么不使用java自带的序列化功能,反而要单独实现一套呢。java自带序列化与编程语言紧密相关,且太负责。hadoop需要一套至精至简、可以精确控制对象读写。
    19. Hadoop为什么不使用RMI,而要使用RPC呢:RPC更高效,且可以精确控制连接、延迟、缓冲。
    20. 基于文件的数据结构:SequenceFile、MapFile
  • 相关阅读:
    【转载】面对酱紫的情况,肿么办哇?
    webform 基础
    LINQ 语句实现分页
    LINQ to SQL 语句
    发送邮件&Timer
    treeview递归
    进程&线程
    登录框记住账号
    窗体-对话框,记事本
    日期与地区的三级联动
  • 原文地址:https://www.cnblogs.com/jiangtao1218/p/8830701.html
Copyright © 2011-2022 走看看