如何确定Hadoop中Mapper中的最后一条记录?

时间:2015-12-21 21:24:21

标签: hadoop mapreduce

在我的映射器中,我需要弄清楚记录是否是给予此映射器的最后一条记录。有没有办法做到这一点?也就是说,让我们说一个映射器被给予1000条记录。映射器逐个处理它们。如何确定映射器何时处理最后一条记录?

1 个答案:

答案 0 :(得分:2)

map()方法内部无法实现,但您可以保存所有输入记录并使用cleanup()方法进行处理。

这样的事情:

public static class LastRecordMapper 
    extends Mapper<LongWritable, Text, Text, IntWritable>{

    private List<Map.Entry<Long, String>> data = new ArrayList<Map.Entry<Long, String>>();

    @Override
    public void map(LongWritable key, Text value, Context context) {
        data.add(new AbstractMap.SimpleEntry<Long, String>(key.get(), value.toString()));
    }

    @Override
    protected void cleanup(Context context) throws IndexOutOfBoundsException {
        Map.Entry<Long, String> lastRecord = data.get(data.size() - 1);

        /* ... Proceed last record ... */

    }

}

但是在RAM中保留所有输入记录时要小心,因为如果没有足够的堆大小,它可能会导致OutOfMemoryException。

如果您只需要上一个输入记录的键和值,那么您只能保存这个:

private Map.Entry<Long, String> lastRecord = null;

@Override
public void map(LongWritable key, Text value, Context context) {
    lastRecord = new AbstractMap.SimpleEntry<Long, String>(key.get(), value.toString());
}