分部式计算的推出就是为了解决性能问题的,就算可以用 Hadoop 来解决大数据量计算的性能问题,还是要避免在代码中埋下性能隐患。在大家熟悉的 Web 程序中代码性能不高可能体现还不明显,因为一次请求的响应只要在人们的接收范围内就可以。而 Hadoop 程序虽然一个程序只有几十行,可在任务执行中会被上百个槽位运行上万、上千万次。所以在 Hadoop 程序中代码的性能也是十分重要的,也许多几行代码或者多一个不必要的判断任务就需要多执行几分钟或是几个小时。对此,笔者总结了一些常用的优化心得,可能都非常简单明了,但这何尝不是 Hadoop 独具魅力的特点,具体如下:

  1. 请多使用常量。
  2. 多用数组与下标(下标数可用常量表达)从 C 时代就知道数据的随机访问很快。
  3. 减少不必要的判断,判断也是计算。计算就有开销。
  4. 加入必要的判断,减少无作用代码的运行次数。
  5. Map 可计算或部分可计算的就用 Map 部分计算。Hadoop 的分发与排序都是有计算开销的,所以如果 Map 输出的数据少了(已经被计算成中间结果了)相对后面的计算开销就会更少。(Combiner 就是出于这个目的产生的)
  6. 步骤整合,如果将两次 Hadoop 计算合并为一次,致少减少了一次主表数据的读入与排序。以下情况是的整合一般是可行的:
    1. 两个子表都是通过同一个字段与主表作 Join
    2. 一个子表与主表 Join 的关键字段同时又用来做分组统计。