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被压缩。在程序中使用如下语句即可:
|
|
对于压缩格式,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/