linghaiyan 发表于 2018-10-30 10:35:08

【总结】Hadoop中的Combiner实践

  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));
  FileOutputFormat.setOutputPath(job, new Path(args));
  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 分钟

页: [1]
查看完整版本: 【总结】Hadoop中的Combiner实践