MapReduce调优

对应用程序进行调优

  1. 避免输入大量小文件。大量的小文件(不足一个block大小)作为输入数据会产生很多的Map任务(默认一个分片对应一个Map任务),而每个Map任务实际工作量又非常小,系统要花更多的时间来将这些Map任务的输出进行整合。如果将大量的小文件进行预处理合并成一个或几个大文件,任务执行的效率可能会提升几十倍。可手动将小文件合并成大文件,或通过Hadoop的SequenceFile、CombineFileInputFormat将多个文件打包到一个输入单元中,使得每个Map处理更多的数据,从而提高性能。

  2. 输入文件size巨大,但不是小文件。这种情况可以通过增大每个mapper的input size,即增大minSize或者增大blockSize来减少所需的mapper的数量。增大blockSize通常不可行,因为当HDFS被hadoop namenode -format之后,blockSize就已经确定了(由格式化时dfs.block.size决定),如果要更改blockSize,需要重新格式化HDFS,这样当然会丢失已有的数据。所以通常情况下只能通过增大minSize,即增大mapred.min.split.size的值。

阅读更多

MapReduce多目录输出笔记

使用MultipleOutputs实现多目录/文件输出

org.apache.hadoop.mapreduce.lib.output.MultipleOutputs

在map或者reduce类中加入如下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private MultipleOutputs<Text, NullWritable> mos;
@Override
protected void setup(Reducer<Text, NullWritable, Text, NullWritable>.Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
super.setup(context);
mos = new MultipleOutputs<Text, NullWritable>(context);// 初始化mos
}
@Override
protected void cleanup(Reducer<Text, NullWritable, Text, NullWritable>.Context context)
throws IOException, InterruptedException {
// TODO Auto-generated method stub
super.cleanup(context);
mos.close();
}
阅读更多

项目中遇到的一些MapReduce优化策略

最近在项目中遇到一些MR可以进行优化的点,记录如下:

小文件合并输入

通过CombineTextInputFormat来合并小文件

1
2
3
4
5
6
//设置split大小
job.getConfiguration().setLong("mapreduce.input.fileinputformat.split.maxsize", 128 * 1024 * 1024);
//job.setInputFormatClass(TextInputFormat.class);

// 合并小文件
job.setInputFormatClass(CombineTextInputFormat.class);
阅读更多

MapReduce应用中CombineFileInputFormat原理与用法

HDFS本身被设计来存储大文件,但是有时难免会有小文件出现,有时很可能时大量的小文件。通过MapReduce处理大量小文件时会遇到些问题。

MapReduce程序会将输入的文件进行分片(Split),每个分片对应一个map任务,而默认一个文件至少有一个分片,一个分片也只属于一个文件。这样大量的小文件会导致大量的map任务,导致资源过度消耗,且效率低下。Hadoop自身包含了CombineFileInputFormat,其功能是将多个小文件合并如一个分片,由一个map任务处理,这样就减少了不必要的map数量。

在了解CombineFileInputFormat之前,我们应了解其父类FileInputFormat的基本处理逻辑。注意这里的FileInputFormat的路径是org.apache.hadoop.mapreduce.lib.input.FileInputFormat,是新的MapReduce API。 mapred包下的FileInputFormat对应老的API,不再推荐使用。

阅读更多