Hadoop的I/O操作

数据完整性

HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。datanode负责在收到数据后存储该数据及其校验和之前对数据进行验证。datanode的管线中最后一个datanode执行校验。HDFS存储着每一个数据块的复本,因此可以通过数据复本来修复锁坏的数据块。可以用hadoop的命令fs -checksum来检查一个文件的校验和,可用于检查HDFS中两个文件是否具有相同的内容。

文件压缩

通用的压缩工具是gzip,是否可切分列表示对应的压缩算法是否支持切分,也就是说,是否可以搜索数据流的任意位置并进一步往下读取数据。可切分压缩格式尤其适合MapReduce。

序列化

将结构化对象转化为字节流以便在网络上传输或写到磁盘进行永久存储的过程,反序列化是指将字节流转回结构化对象的逆过程。序列化用于分布式数据处理的两大领域:进程间通信和永久存储。

Hadoop使用的是自己的序列化格式Writable,它紧凑、速度快,但不太容易被Java以外的语言进行扩展和使用。因为Writable是Hadoop的核心(大多数MapReduce程序都会为键和值类型使用它)

Hadoop中的Writable类的层次结构:

Java基本类型的Writable封装器

Writable类对所有Java基本类型提供封装,除char类型(可以存储在IntWritable中),所有的封装包含get()和set()方法用于读取或存储封装的值。    定长格式编码很适合数值在整个值域中分布非常均匀的情况,例如哈希函数。但大多数数值变量的分布都不均匀,一般而言变长格式会更节省空间,变长编码的另一个优势是可以在VIntWritable和VLongWritable转换,所以选择变长格式之后,便有增长的空间,不必一开始就用8字节的long表示。

Text类型

是针对UTF-8序列的Writable类。一般认为是String类的Writable等价。但String和Text还是有很本质的区别的,比如长度。String的长度是其所含的char编码单元的个数,但Text对象的长度却是其UTF-8编码的字节数。另外,String类的indexof()方法返回char编码单元中的索引位置,Text类的find()方法则返回字节偏移量。

与String相比,Text 的另一个区别在于它是可变的(与所有Hadoop Writable接口实现类似),可以通过调用其中一个set()方法来重用Text实例。Text并不用有足够的操作String类的API,所以多数情况下要将Text 对象转换成String对象,这一转换可以通过toString()方法来实现,new Text("Hadoop").toString()

NullWritable是Writable的特殊类型,它的序列化长度为0,既不从数据流读取数据,也不向数据流写入数据,它充当占位符。

Avro数据文件详见12章,可移植,可跨编程语言,被Hadoop生态系统的各组件广为支持,因此被默认为是对二进制格式的一种比较好的选择。

map文件、Avro文件和顺序文件都是面向行的格式,每一行的值在文件中连续存储。

猜你喜欢

转载自blog.csdn.net/Saikikky/article/details/84334221
今日推荐