Hadoop-2.3.0学习(6)——MapReduce性能调优

时间:2021-01-27 18:26:26

一个程序完成基本的功能是还不够的,还有一些具有实际意义的问题需要解决,比如性能是不是足够好、有没有足够的空间等。

前面都是MapReduce程序的基本实现,现在要来简单介绍一下提高性能的方法。

  • 输入采用大文件

对于同样10G的文件总量,MapReduce一次性处理一个10G大文件的时间是要少于处理1000个总量10G的小文件的时间的,所以如果将要处理的是一堆小文件、大总量的数据,不妨先经过一次预处理,将许多小文件合并成一个大文件块,再使用MapReduce处理。
另外,如果不对小文件进行合并的预处理,也可以借用Hadoop中的CombineFileInputFormat函数。他可以将多个文件打包到一个输入单元中,从而每次执行Map操作就会处理更多的数据。同时,CombineFileInputFormat会考虑节点和集群的位置信息,以决定哪些文件被打包到一个单元之中,所以使用CombineFileInputFormat也会使性能得到相应地提高。
  • 压缩文件
在分布式系统中,不同节点的数据交换是影响整体性能的一个重要因素,另外在Hadoop的Map阶段所处理的输出大小也会影响整个MapReduce程序的执行时间,(因为Map阶段的输出首先存储在一定大小的内存缓冲区中)
一个提高性能的方法是对Map的输出进行压缩。这样会带来以下几个方面的好处:更少存储文件的空间;加快数据在网络上(不同节点间)的传输速度,以及减少数据在内存和磁盘间交换的时间。
可以通过将mapred.compress.map.output属性设置为true来对Map的输出数据进行压缩。
  • 过滤数据
数据过滤主要指在面对海量输入数据作业时,在作业执行之前先将数据中无用数据、噪声数据和异常数据清除。通过数据过滤可以降低数据处理的规模,较大程度地提高数据处理效率,同时避免异常数据或不规范数据对最终结果造成负面影响。
这里介绍一种过滤器进行数据过滤—— Bloom Filter(布隆过滤器),具体使用找到两篇资料,说得更好:
wiki上的布隆过滤器:http://zh.wikipedia.org/zh-cn/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8
BloomFilter–大规模数据处理利器(解决空查问题):http://www.dbafree.net/?p=36
  • 修改作业属性
属性mapred.tasktracker.map.tasks.maximum的默认值是2,因此每个节点上实际上运行状态的Map和Reduce的任务数最多为2,而较为理想的数字应在10-100之间。
其余作业属性修改以及理由,参见:http://heipark.iteye.com/blog/1146838