1. 通过combiner来减少网络的流量
Combiner可以减少在map和reduce阶段之间的数据量,较低的数据传输量可以较好的较少运行时间。
2 减少输入数据量
这个有点牵强,但是对于有某些分布特征的数据来说可以通过采样的方式进行输入数据缩减。对于某些分析应用而言,这是一个可行的选择,抽样降低到的是精度,而不是准确性。
3使用压缩
即使在map和reduce之间使用了Combiner,在map阶段的输出可能还是很大,这些中间数据必须存储在磁盘上,并在网络中重排,压缩这些中间数据,会很大的提升大多数的MapReduce作业的性能,而且十分简单。
Hadoop 内置支持的压缩和解压,启用对map输出的压缩涉及两个属性的配置。
属性 | 描述 |
mapred.compress.map.output | Boolean属性,表示mapper的属性是否被压缩 |
mapred,map.output.compression.codec | Class属性,表示那种CompressionCodec被用于mapper的输出 |
设置mapred.compress.map.output为true就可以实现对mapper的输出进行压缩,还应该在mapred,map.output.compression.codec中设置合适的codec(编/解码器)类,Hadoop中的所有的编/解码器类都实现了CompressionCode接口,Hadoop 支持的一些压缩编码器如下:
例如,使用GZIP压缩,你可以设置配置对象
4 重用JVM
默认情况下,TaskTracker将每个Mapper和Reducer任务作为子进程分别运行在独立的JVM中,这必然给每个任务引入JVM的启动带来开销。
为每个task启动一个新的JVM将耗时1秒左右,对于运行时间较长(比如1分钟以上)的job影响不大,但如果都是时间很短的task,那么频繁启停JVM会有开销。
如果我们想使用JVM重用技术来提高性能,那么可以将mapred.job.reuse.jvm.num.tasks设置成大于1的数。这表示属于同一job的顺序执行的task可以共享一个JVM,也就是说第二轮的map可以重用前一轮的JVM,而不是第一轮结束后关闭JVM,第二轮再启动新的JVM。
那么最多一个JVM能顺序执行多少个task才关闭呢?这个值就是mapred.job.reuse.jvm.num.tasks。如果设置成-1,那么只要是同一个job的task(无所谓多少个),都可以按顺序在一个JVM上连续执行。
如果task属于不同的job,那么JVM重用机制无效,不同job的task需要不同的JVM来运行。
注意:
JVM重用技术不是指同一Job的两个或两个以上的task可以同时运行于同一JVM上,而是排队按顺序执行。
一个tasktracker最多可以同时运行的task数目由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum
决定,并且这两个参数在mapred-site.xml中设置。其他方法,如在JobClient端通过命令行
-Dmapred.tasktracker.map.tasks.maximum=number或者conf.set(“mapred.tasktracker.map.tasks.maximum”,“number”)设置都是无效的。
5 根据猜想执行来运行
在一个job执行时,如果出现一个节点失效,Hadoop可以监督运行节点的健康状态,并自动启动失效节点上的任务。
但是通常节点不会突然地失效,而是会经历一段降速的过程,就像输入/输出设备异常变坏一样,在这种情况下,系统仍在工作,但是任务运行的更慢了,有时任务变慢还因为发生了临时的阻塞,这并不影响正在执行的任务的准确性,但是会影响其性能,一个运行缓慢的人去甚至会延误整个MapReduce作业的完成,在所有的mappepr完成之前,reducer都不会启动,类似的,在所有的reducer完成之前,一个作业也不会结束。
为了解决这个问题,Hadoop使用了幂等特性,不在任务失败了再重启任务,Hadoop会注意到运行速度变得缓慢的任务。并安排一个节点,并行的执行相同的任务,幂等特性保证同步的任务产生相同的输出结果。Hadoop会监督这两个并行的任务,只要一个任务完成,Hadoop会采用它的输出,杀死其他并行的任务,整个过程称为猜想执行。
默认情况下,猜想执行时初五开启的状态,可以分别在map任务和reduce任务端关闭这个设置,只需要将表中的属性改为false,他们仅作用于单个作业,但你也可以更改集群的配置文件来改变整个集群的默认配置。
为什么将其关闭,原因如下: