Hadoop: The Definitive Guide 4th 读书笔记—chapter5: Hadoop IO

Data Integrity

hadoop使用checksum来验证数据的正确性。

Data integrity in hdfs

datanodes和client都是在读取数据的时候检查checksum

一般是client读取时发现其有错,则client会将这个bad block报告出去。namenode会将这个数据块标记成corrupt,然后从其他地方拷贝一个正确的block。当正确的block成功时,corrupt block replica被删除

Compression

使用compression是一个时间和空间的trade off。压缩的时间越长,一般压缩效果越好,传输时间越短。同时要注意压缩的数据能不能被并行的读,也就是说一个数据是不是只读某一块即可解压,而不是必须读取全部数据才能解压。

压缩时不经可以设置结果被压缩,也可以设置map端的outpu被压缩。在程序中使用如下语句即可:

1
2
3
4
5
conf.setBoolean("mapreduce.map.output.compress", true);
conf.setClass("mapreduce.map.output.compress.codec", GzipCodec.class, CompressionCodec.class);
conf.setBoolean("mapreduce.output.fileoutputformat.compress", true);
conf.setClass("mapreduce.output.fileoutputformat.compress.codec", GzipCodec.class, CompressionCodec.class);

对于压缩格式,gzip不可以被分割,bzip2计算时间过长,loz需要对环境进行配置。具体可以见这篇文章。loz的配置可以见这里。IBM的一片压缩技术实现的文章

测试了一下,因为hive本身用了rcfile,效果并不明显,只是观测到了不同压缩的确影响到了mapper的数量,时间上相差并不是很大。

Serialization

这一节主要需要理解的是数据在hadoop中如何序列化和反序列化,以及其原因。其中常用的xxwritable和text两个类就是做序列化的。
序列化的四个目标是:

  • Compact:(数据密度大?)充分利用带宽
  • Fast: 序列化和反序列化开销小
  • Extensible:
  • Interoperable:不同语言之间兼容

自己定义writable类需要实现writable和comparable接口。同时注意comparator的实现时应该直接比较序列化以后的结果,而不是反序列化回来以后进行比较。
书中给了如何自己写writable和comparable的例子。其中提到了hashcode()函数会直接影响reduce的任务分配

常用的序列化框架还有thrift和Avro等


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/01/07/Hadoop-The-Definitive-Guide-4th-读书笔记—chapter5-Hadoop-IO/