Hadoop的主要吸引力之一就是它的线性可扩展性。许多作业都可以通过添加更多的机器来加速。

Hadoop在性能调优上有一些特定的手段和技巧,总体来说颇有成效。

1、通过Combiner来减少网络流量

Combiner可以减少在map和reduce之间的shuffle的数据量,较低的网络流量缩短了执行时间

2、减少输入数据量

在处理大型数据集时,有相当一部分时间花费在扫描磁盘中的数据。减少需要读取的字节数,可以提高总体的吞吐量。

  1. 减少处理的数据量:例如只处理数据采集后的子集,对于某些分析应用这是可行的,因为抽样只是降低了精度而不是准确度
  2. 重构输入数据为几个较小的数据集:每个数据集只包含数据处理所需的特定类型

3、使用压缩

mapreduce的中间结果必须存储在磁盘中,并在网络上重排,压缩这些数据会提高大多数MR作业的性能

Hadoop内置支持压缩和解压缩,启用对map输出的压缩设计2个属性的配置

  • mapred.compress.map.output Boolean属性,表表示输出是否压缩
  • mapred.map.output.compression.codec Class属性,表示采用哪种压缩方式
conf.setBoolean("mapred.compress.map.output","true")
conf.setClass("mapred.map.output.compression.codec","Compressiocodec.class")
  • DefaultCodec
  • GzipCodec
  • Bzip2Codec
conf.setOutputFormat(SequnceFileOutputFormat.class);
SequenceFileOutputFormat.setOutputCompressionType(conf,CompressionType.Block);
FileOutputFormat.setCompressOutput(conf,true);
FileOutputFormat.setOutputCompressorClass(conf,GzipCodec.class);

输出压缩序列文件的配置属性

属性

描述

mapred.ouput.compression.type

String属性 序列文件的压缩类型(可以为NONE\RECORD\BLOCK)

mapred.output.compress

Boolean属性,是否压缩作业的输出

mapred.output.compression.codec

Class属性,指定用于压缩作业输出的编/解码器

4、重用JVM

默认情况下,TaskTracker(AM)将每个Mapper和Reducer任务作为子进程分别运行在独立的JVM中。这必然给每个任务引入JVM的启动开销。

在相同作业的多个任务之间重用JVM,这样启动开销被平摊到多个任务中

运行JVM重用的配置属性

属性

描述

mapred.job.reuse.jvm.num.taskes

整数属性,一个JVM可以运行的最大任务数,-1表示无限制

JobConf对象中有一个便捷的方法,setNumTask是ToExecutePer(int)来设置作业的属性

5、根据猜测执行来运行

启动和进制猜测执行的属性

属性

描述

mapred.map.tasks.speculative.execution

布尔属性,表示是否运行map任务推测机制

mapred.reduce.tasks.speculative.execution

布尔属性,表示是否运行reduce任务推测机制