Надеюсь, у меня есть лучшее решение, чем принятый ответ.
Вместо того, чтобы выдавать 1 для каждой записи, почему бы нам не увеличить счетчик в map () и не увеличить счетчик после каждой задачи карты в cleanup ().
Промежуточные записи чтения могут быть уменьшены. А для редуктора нужно только агрегировать список из нескольких значений.
public class LineCntMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
Text keyEmit = new Text("Total Lines");
IntWritable valEmit = new IntWritable();
int partialSum = 0;
public void map(LongWritable key, Text value, Context context) {
partialSum++;
}
public void cleanup(Context context) {
valEmit.set(partialSum);
context.write(keyEmit, valEmit);
}
}
Вы можете найти полный рабочий код здесь