Hadoop的主要吸引力之一就是它的线性可扩展性。许多作业都可以通过添加更多的机器来加速。
Hadoop在性能调优上有一些特定的手段和技巧,总体来说颇有成效。
1、通过Combiner来减少网络流量
Combiner可以减少在map和reduce之间的shuffle的数据量,较低的网络流量缩短了执行时间
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任务推测机制 |