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



在我的映射器中,我需要弄清楚一条记录是否是给这个映射器的最后一条记录。有办法做到这一点吗?也就是说,假设一个映射器有1000条记录。映射器一个接一个地处理它们。如何计算映射器何时处理最后一条记录?

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

相关内容

  • 没有找到相关文章

最新更新