与任何I / O子系统不同,Hadoop还带有一组原语。当然,这些原始考虑因素虽然是通用的,但也与Hadoop IO系统一起使用,并具有一些特殊的内涵。Hadoop处理数TB的数据集; 对这些原语的特殊考虑将让我们了解Hadoop如何处理数据输入和输出。本文快速浏览这些原语,以便对Hadoop输入输出系统进行透视。
数据的完整性
数据完整性意味着数据在其存储,处理和检索操作中应保持准确和一致。为了确保在持久性和处理期间没有数据丢失或损坏,Hadoop保持严格的数据完整性约束。每次读/写操作都发生在磁盘中,因此通过网络更容易出错。而且,Hadoop处理的数据量只会加剧这种情况。检测损坏数据的常用方法是通过校验和。一个校验当数据首次进入系统并在检索过程中通过通道发送时计算。检索端再次计算校验和并与接收的校验和匹配。如果它完全匹配,则认为数据没有错误,否则它包含错误。但问题是 - 如果校验和发送本身是腐败的呢?这是极不可能的,因为它是一个小数据,但不是一个不可否认的可能性。使用诸如ECC存储器之类的正确硬件可以用于缓解这种情况。
这仅仅是检测。因此,为了纠正错误,使用另一种称为CRC(循环冗余校验)的技术。
Hadoop更进一步,为每512个(默认)字节数据创建一个独特的校验和。由于CRC-32仅为4字节,因此存储开销不是问题。进入系统的所有数据在转发存储或进一步处理之前由数据节点验证。发送到datanode管道的数据通过校验和进行验证,发现的任何损坏都会立即通过ChecksumException通知客户端。从datanode读取的客户端也经历了相同的钻取。数据节点维护校验和验证日志以跟踪已验证的块。在从客户端接收到块验证成功信号时,由datanode更新日志。此类统计信息有助于防止坏磁盘出现问题。
除此之外,在DataBlockScanner的帮助下,在后台运行datanode线程,对块存储进行定期验证。这可以保护数据免受物理存储介质中的损坏。
Hadoop维护数据的副本或副本。这特别用于从大规模腐败中恢复数据。一旦客户端在读取块时检测到错误,它会在抛出ChecksumException之前立即向datanode报告namenode中的坏块。然后,namenode将其标记为坏块,并将对块的任何进一步引用安排到其副本。以这种方式,副本与其他副本一起维护,并且标记的坏块从系统中移除。
对于在Hadoop LocalFileSystem中创建的每个文件,都会创建一个在同一目录中具有相同名称的隐藏文件,扩展名为。<filename> .crc。此文件维护文件中每个数据块(512字节)的校验和。元数据的维护有助于在扔之前检测读取错误ChecksumException由LocalFileSystem。
压缩
记住Hadoop处理的数据量,压缩不是奢侈品,而是要求。Hadoop正确使用的文件压缩有许多明显的好处。它节省了存储要求,是加速网络和磁盘上数据传输的必备功能。Hadoop常用的工具,技术和算法很多。它们中的许多都非常受欢迎,并且已经在历史上用于文件压缩。例如,经常使用gzip,bzip2,LZO,zip等。
序列化
将结构化对象转换为字节流的过程称为序列化。这是通过网络传输数据或在磁盘中保留原始数据时特别需要的。反序列化只是一个反向过程,其中一个字节流被转换为结构化对象。这对于原始字节的对象实现尤其需要。因此,分布式计算在几个不同的领域中使用它并不奇怪:进程间通信和数据持久性。
Hadoop使用RPC(远程过程调用)来实现节点之间的进程间通信。因此,RPC协议使用序列化和反序列化的过程将消息呈现给字节流,反之亦然,并通过网络发送消息。但是,该过程必须足够紧凑,以便最好地利用网络带宽,以及快速,可互操作和灵活,以适应随时间推移的协议更新。
Hadoop有自己的紧凑和快速序列化格式,Writable,MapReduce程序用来生成键和值类型。
文件的数据结构
有几个高级容器在Hadoop中详细说明了专用数据结构,以容纳特殊类型的数据。例如,为了维护二进制日志,SequenceFile容器提供了用于保持二进制键值对的数据结构。然后我们可以使用密钥,例如LongWritable表示的时间戳和Writable的值,它指的是记录的数量。
还有另一个容器,SequenceFile的排序派生,称为MapFile。它提供了按键方便查找的索引。
这两个容器是可互操作的,可以相互转换。
结论
这只是Hadoop输入/输出系统的快速概述。我们将在后续文章中深入研究许多复杂的细节。如果人们对I / O系统有基本的了解,那么理解Hadoop输入/输出系统并不是很困难。Hadoop简单地为它添加了一些额外的果汁以跟上其在大规模数据中工作的分布式特性。就这样。