1、HDFS的数据完整性: Hadoop会对写入的所有数据计算校验和,并在读取数据时验证校验和。 datanode负责在收到数据后存储该数据及其验证校验和。 客户端从datanode读取数据时,也会验证校验和,将它们与datanode中存储的校验和进行比较。Datanode也会在后台线程中运行一个DataBlockScanner定期验证存储在这个datanode上的所有数据块。 HDFS存储这每个数据块的复本,它可以通过数据复本来修复损坏的数据库,得到一个新的、完好无损的复本。基本思路为:客户端读取数据块——>检测到错误——>向namenode报告损坏的数据块及其正在尝试操作的当前的datanode,抛出异常——>namenode标记此数据块复本为已损坏——>namenode安排该数据块的一个复本复制到另一个datanode——>删除已损坏的数据块复本。
2、压缩: 文件压缩两大好处:减少存储文件所需要的磁盘空间,加速数据在网络和磁盘上的传输。与Hadoop结合使用的法如下: 3、序列化: 序列化是指将结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程。反序列化是指将字节流转回结构化对象的逆过程。序列化在分布式数据处理的两大领域经常出现:进程间通信和永久存储。 在Hadoop中,系统中多个节点上进程间的通信是通过“远程过程调用”(remote procedure call,RPC)实现的。RPC协议将消息序列化成二进制流后发送到远程节点,远程节点接着将二进制流反序列化为原始消息。 通常希望序列化格式比较紧凑(能高效实用存储空间)、快速(以读/写数据的额外开销比较小)、可扩展(以可以透明地读取老格式的数据)且可以互操作(以可以使用不同的语/言读写永久存储的数据)。Hadoop使用自己的序列化格式Writable,它绝对进程、速度快、但不太容易用Java以外的语言进行扩展或使用。Writable是Hadoop的核心,大多数MapReduce程序都是Writable类型的键和值。Writable类对Java基本类型提供封装。所有的封装包含get()和set()两个方法用于读取或存储封装的值。 4、Avro: Apache Avro是一个独立于编程语言的数据序列化系统,旨在解决Hadoop中Writable类型的不足:缺乏语言的可移植性。Avro通常用JSON来写,数据通常采用二进制格式来编码,但也有其他选择。 5、基于文件的数据结构: SequenceFiles可作为小文件的容器。HDFS和MapReduce是针对大文件优化的,通过SequenceFiles类型将小文件包装起来可获得更高效的存储和处理。
|