地图减少计数器上的条件来控制地图输出



是否有机会在映射器级别控制映射器输出的用户定义java计数器上放置条件?

       Long l = context.getCounter(Counters.COUNT).getValue();
        if(5L >= l) {
            context.getCounter(Counters.COUNT).increment(1);
            context.write((LongWritable)key, value);
        } else {
            System.out.println("MAP ELSE");
            return;
        }

得到多于5条记录输入到减速器。有没有可能控制这一切???

你不能这样做,如果你的输入文件有3个拆分,那么你将有3个映射器在运行。每个映射器都有自己的计数值(取决于如何增加计数值的逻辑),只有在洗牌阶段之后所有映射器完成后,才会在reduce端知道这个值。

如果你想限制你的映射输出。然后有一个单一的减速机job.setNumReduceTasks(1),并限制减速机的输出。像这样。

public static class WLReducer2 extends
        Reducer<IntWritable, Text, Text, IntWritable> {
    int count=0;
    @Override
    protected void reduce(IntWritable key, Iterable<Text> values,
            Context context) throws IOException, InterruptedException {
        for (Text x : values) {
            if (count < 5)
            context.write(key, x);
            count++;
        }
    };
}

如果您想获得减少侧的计数器值。您可以将其添加到reduce setup方法中。

 @Override
    public void setup(Context context) throws IOException, InterruptedException{
        Configuration conf = context.getConfiguration();
        Cluster cluster = new Cluster(conf);
        Job currentJob = cluster.getJob(context.getJobID());
        mapperCounter = currentJob.getCounters().findCounter(COUNTER_NAME).getValue();  
    }

相关内容

  • 没有找到相关文章

最新更新