一.数据完整性
数据检查:一般使用CRC -32方式检查数据完整性
1.对本地文件I/o的数据完整性检查
hdfs写入的时候计算出校验和,然后每次读的时候再计算校验和。要注意的一点是,hdfs每固定长度就会计算一次校验和,这个值由io.bytes.per.checksum指定,默认是512字节。因为CRC32是32位即4个字节,这样校验和占用的空间就会少于原数据的1%。同时你也可以关闭校验。
2.对HDFS i/o的数据完整性检查
1)datanode在存储收到的数据前会校验数据的校验和,比如收到客户端的数据或者其他副本传过来的数据。hdfs数据流中客户端写入数据到hdfs时的数据流,在管道的最后一个datanode会去检查这个校验和,如果发现错误,就会抛出ChecksumException到客户端。(这里的客户端可能是一个DataNode也可能只是一个客户端而已并不是Hadoop节点)
2)客户端从datanode读数据的时候一样要检查校验和,而且每个datanode还保存了检查校验和的日志,客户端的每一次校验都会记录到日志中。
3)datanode还跑着一个后台进程(DataBlockScanner)来定期校验存在在它上面的block,因为除了读写过程中会产生数据错误以外,硬件本身也会产生数据错误,比如说位衰减(bit rot)。
3.文件修护
如果发现某个数据块失效,读操作涉及的用户,DataNode,NameNode都会尝试恢复,而且恢复称该后会设置标签标记,防止其他人重复修护。
二.文件分类
SequenceFile
https://www.cnblogs.com/yangsy0915/p/5559678.html
Record:存储SequenceFile通用的KV数据格式,Key和Value都是二进制变长的数据。Record表示Key和Value的byte的总和。
Sync:主要是用来扫描和恢复数据的,以至于读取数据的Reader不会迷失。
Header:存储了如下信息:文件标识符SEQ,key和value的格式说明,以及压缩的相关信息,metadata等信息。
metadata:包含文件头所需要的数据:文件标识、Sync标识、数据格式说明(含压缩)、文件元数据(时间、owner、权限等)、检验信息等
三.文件压缩
使用压缩的优点如下:
1. 节省数据占用的磁盘空间; 2. 加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度。
Hadoop 对于压缩格式的是自动识别。如果我们压缩的文件有相应压缩格式的扩展名(比如 lzo,gz,bzip2 等)。Hadoop会根据压缩格式的扩展名自动选择相对应的解码器来解压数据,此过程完全是 Hadoop 自动处理,我们只需要确保输入的压缩文件有扩展名。
使用方式
MapReduce 可以在三个阶段中使用压缩。
1. 输入压缩文件。如果输入的文件是压缩过的,那么在被 MapReduce 读取时,它们会被自动解压。
2.MapReduce 作业中,对 Map 输出的中间结果集压缩。实现方式如下:
1)可以在 core-site.xml 文件中配置,代码如下
2)使用Java代码指定
conf.setCompressMapOut(true);
conf.setMapOutputCompressorClass(GzipCode.class);
最后一行代码指定 Map 输出结果的编码器。
3.MapReduce 作业中,对 Reduce 输出的最终结果集压。实现方式如下:
1)可以在 core-site.xml 文件中配置,代码如下
2)使用 Java 代码指定
conf.setBoolean(“mapred.output.compress”,true);
conf.setClass(“mapred.output.compression.codec”,GzipCode.class,CompressionCodec.class);
最后一行同样指定 Reduce 输出结果的编码器。
分割
同样压缩分割和输入分割也很重要。分割储存也会影响到执行效率。
四.序列化
序列化的用途
1)作为一种持久化格式
2)作为一种通信的数据格式
3)作为一种数据拷贝、克隆机制
序列化的特征:
1)紧凑:Hadoop中最稀缺的资源是宽带,所以紧凑的序列化机制可以充分的利用宽带。
2)快速:通信时大量使用序列化机制,因此,需要减少序列化和反序列化的开销。
3)可扩展:随着通信协议的升级而可升级。
4)互操作:支持不同开发语言的通信。
Writable接口提供了两个方法,Write和readFiles(序列化和反序列化)
Hadoop序列化类
实现了WritableComparable接口的类
基础类:BooleanWritable,ByteWritable,IntWritable,VIntWritable,
FIntWritable,LongWritbale,VLongWritavle,DoubleWritable
高级类:NullWritable,Text,BytesWritable,MDSHash,ObjectWritable,
GenericWritable
仅实现了Writable接口的类:
数组:AbstractWritable,TwoDArrayWritable
映射:AbstractMapWritable,MapWritable,SortedMapWritable
网友评论