1、任务调度
任务调度是Hadoop中非常重要的一环,这个优化又涉及两个方面的内容。计算方面:Hadoop总会优先将任务分给空闲的机器,使得所有任务能公平地分享系统资源。IO方面:Hadoop会尽量将Map任务分配给InputSplit所在的机器,以减少网络IO的消耗。
2、数据预处理与InputSplit的大小
MapReduce任务擅长处理少量的大数据,而在处理大量的小数据时,mapreduce的性能就会逊色许多。因此在提交mapreduce任务前可以先对数据进行一次预处理,将数据合并以提高mapreduce的效率。
3、Map与Reduce任务的数量
首先要定义两个概念——Map/Reduce任务槽。Map/Reduce任务槽就是这个集群能够同时运行的Map/Reduce任务的最大数量。
设置mapreduce任务的map数量主要参考的是map的运行时间,设置reduce任务的数量就只需要参考任务槽的设置即可。一般来说,reduce任务的数量应该是reduce任务槽的0.95倍或1.75倍,这是基于不同的考虑来决定的。当reduce任务的数量是任务槽的0.95倍时,如果一个reduce任务失败,hadoop可以很快找到一台空闲的机器重新执行这个任务。当reduce任务是任务槽的1.75倍时,执行速度快的机器可以获得更多的reduce任务,因此可以使负载更均衡,以提高任务的处理速度。
4、Combine函数
Combine函数是用于本地合并数据的函数。在有些情况下,map函数产生的中间数据会有很多重复的,比如在一个简单的wordcount程序中,每个map任务可能会产生很多个《the,1》记录,若将这些记录一一传给reduce任务是很耗时的。所以,我们可以运行自定义的combine函数用于本地合并,这会大大减少网络IO操作的消耗。