热门IT资讯网

【总结】Hadoop中的Combiner实践

发表于:2024-11-24 作者:热门IT资讯网编辑
编辑最后更新 2024年11月24日,Combiner作用是合并Mapper的输出,Combiner的输出作为Reducer的输入,这样可以减少map任务和reducer任务之间的数据传输。1、在Job中设置Combiner和不设置Com

Combiner作用是合并Mapper的输出,Combiner的输出作为Reducer的输入,这样可以减少map任务和reducer任务之间的数据传输。


1、在Job中设置Combiner和不设置Combiner,观察Reducer输入情况


使用如下代码设置Combiner

job.setCombinerClass(MaxTemperatureReducer.class);


@Override

public int run(String[] args) throws Exception {

Job job = new Job();

job.setJarByClass(MaxTemperature.class);

job.setJobName("Max temperature");

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.setMapperClass(MaxTemperatureMapper.class);

//job.setCombinerClass(MaxTemperatureReducer.class); 是否设置Combiner

job.setReducerClass(MaxTemperatureReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

job.waitForCompletion(true);

//输出任务完成情况

System.out.println( "任务名称:" + job.getJobName() );

System.out.println( "任务成功:" + ( job.isSuccessful()?"是":"否" ) );

System.out.println( "输入行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_INPUT_RECORDS").getValue() );

System.out.println( "输出行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue() );

System.out.println( "输出行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "REDUCE_INPUT_RECORDS").getValue() );

return job.isSuccessful() ? 0 : 1;

}

2、以下是不设置Combiner的情况输出结果,Reducer输入行数与Mapper输出行数相等


任务名称:Max temperature

任务成功:是

MAP_INPUT_RECORDS输入行数:1207

MAP_OUTPUT_RECORDS行数:1190

REDUCE_INPUT_RECORDS行数:1190

任务开始:2015-04-24 14:26:00

任务结束:2015-04-24 14:26:03

任务耗时:0.04995 分钟


3、以下是设置Combiner的情况输出结果,经过Combiner后,Reducer输入行数大幅度减少。


任务名称:Max temperature

任务成功:是

MAP_INPUT_RECORDS输入行数:1207

MAP_OUTPUT_RECORDS行数:1190

REDUCE_INPUT_RECORDS行数:1

任务开始:2015-04-24 14:28:23

任务结束:2015-04-24 14:28:25

任务耗时:0.030966667 分钟


0