Hadoop中的数据压缩如何影响计算效率?代码举例讲解

数据压缩会对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,将文本行转为键值对。

数据压缩的主要作用是:

  1. 提高存储和I/O效率。
  2. 加速网络数据传输。
  3. 增加内存计算能力。
  4. 优化系统吞吐量。