数据压缩会对Hadoop的计算效率产生以下影响:
1、 提高磁盘空间利用率和I/O效率:
- 压缩后的数据体积更小,可以存储更多的数据。
- 从磁盘读取压缩后的数据量更少,I/O性能提高。
2、 降低网络传输量:
- 向其他节点传输压缩后的数据量更少,网络开销降低。
- 加快作业初始化和任务切片的传输速度。
3、 提高计算节点内存使用率:
- 压缩后的数据在内存中占用更小空间,可以加载更多的数据进行计算。
4、 降低CPU util:
- 解压缩需要消耗一定的CPU资源,会导致可用于计算的CPU util降低。
- 严重影响CPU密集型的计算作业。
5、 影响最终的吞吐量:
- I/O、网络和内存的提高可以增大系统吞吐量。
- CPU util的降低会减小系统吞吐量。
- 需要根据数据和算法特征选择最优的压缩Codec。
6、 使用GzipCodec压缩后计算的示例:
- 压缩文本文件test.txt:
hadoop fs -copyToLocal test.txt
gzip test.txt
hadoop fs -copyFromLocal test.txt.gz /test.txt.gz
- 作业中设置GzipCodec:
java
Job job = Job.getInstance(conf);
FileInputFormat.setInputPaths(job, "/test.txt.gz");
job.setInputFormatClass(TextInputFormat.class);
SequenceFileOutputFormat.setOutputPath(job, "/out");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setOutputFormatClass(SequenceFileOutputFormat.class);
job.setMapperClass(GzipMapper.class);
job.setReducerClass(IntSumReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// Enable GZIP compression
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
- GzipMapper同TextInputMapper,将文本行转为键值对。
数据压缩的主要作用是:
- 提高存储和I/O效率。
- 加速网络数据传输。
- 增加内存计算能力。
- 优化系统吞吐量。