condition on map reduce计数器来控制map输出

qxgroojn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(589)

有没有可能在Map器级别对用户定义的java计数器设置条件来控制Map器输出??

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条记录。有机会控制这一切吗。???

00jrzges

00jrzges1#

你不能这样做,如果你的输入文件有3个分裂,那么你将有3个Map器运行。每个Map器都有其各自的计数值(取决于如何增加计数值的逻辑),并且只有在所有Map器在shuffle阶段完成后,reduce端才会知道。
如果要限制Map输出。然后有一个减速机 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端的计数器值。您可以将其添加到reduce设置方法中。

@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();  
    }

相关问题