MapReduce 计算模型的优化涉及了方方面面的内容,但是主要集中在两个方面:一是计算性能方面的优化:二是I/O操作方面的优化。这其中,又包含六个方面的内容。
1.任务调度
任务调度是Hadoop中非常重要的一环,这个优化又涉及两个方面的内容。计算方面,Hadoop总会优先将任务分配给空闲的机器,使所有的任务能公平地分享系统资源。I/O方面。Hadoop会尽量将Map任务分配给InputSplit所在的机器,以减少网络I/O的消耗。
2.数据预处理与InputSplit的大小
MapReduce任务擅长处理少量的大数据,而在处理大量的小数据时, MapReduce的性能就会逊色很多。因此在提交MapReduce任务前可以先对数据进行一次预处理,将数据 合并以提高MapReduce任务的执行效率,这个办法往往很有效。如果这还不行,可以参考Map任务的运行时间,当一个Map任务只需要运行几秒就可以结束时,就需要考虑是否应该给它分配更多的数据。通常而言,一个Map任务的运行时间在一分钟左右比较合适,可以通过设置Map的输入数据大小来调节Map的运行时间。在FilelnputFormat中(除了CombineFilelnputFormat ), Hadoop会在处理每个Block后将其作为一个InputSplit,因此合理地设置block块大小是很重要的调节方式。除此之外,也可以通过合理地设置Map任务的/数量来调节Map任务的数据输入。
3. Map和Reduce任务的数量
合理地设置Map任务与Reduce任务的数量对提高MapReduce任务的效率是非常重要的。默认的设置往往不能很好地体现出MapReduce任务的需求,不过,设置它们的数量也要有一定的实践经验。
4. Combine函数
Combine函数是用于本地合并数据的函数。在有些情况下, Map函数产生的中间数据会有很多是重复的,比如在一个简单的WordCount程序中,因为词频是接近与一个zipf分布的,每个Map任务可能会产生成千上万个<the, 1>记录,若将这些记录一一传送给Reduce任
务是很耗时的。所以, MapReduce框架运行用户写的combine函数用于本地合并,这会大大
减少网络I/O操作的消耗。此时就可以利用combine函数先计算出在这个Block中单词the的
个数。合理地设计combine函数会有效地减少网络传输的数据量,提高MapReduce的效率。
在MapReduce程序中使用combine很简单,只需在程序中添加如下内容:
在Hadoop中,可以自定义数据类型以实现更复杂的目的,比如,当读者想实现k-means算法(一个基础的聚类算法)时可以定义k个整数的集合。自定义Hadoop数据类型时,推荐自定义comparator来实现数据的二进制比较,这样可以省去数据序列化和反序列化。的时间,提高程序的运行效率.