Прежде всего ваши наборы данных разделяются на несколько карт, если они находятся в отдельных файлах или превышают настроенный размер блока.Так что, если у вас есть один набор данных размером 128 МБ, а размер вашего блока составляет 64 МБ, hadoop 2-блок заблокирует этот файл и настроит 2 сопоставителя для каждого.Это похоже на пример wordcount в уроках hadoop.Как говорит Дэвид, вам нужно отобразить пары ключ / значение в HDFS, а затем сократить их.Я бы реализовал это так:
// field in the mapper class
int groupId = 0;
@Override
protected void map(K key, V value, Context context) throws IOException,
InterruptedException {
if(key != groupId)
groupId = key;
context.write(groupId, value);
}
@Override
protected void reduce(K key, Iterable<V> values,
Context context)
throws IOException, InterruptedException {
int size = 0;
for(Value v : values){
size++;
}
context.write(key, size);
}
Как сказал Дэвид, вы можете использовать комбинатор.Комбинаторы - это простые редукторы, которые используются для сохранения ресурсов между картами и сокращения фаз.Они могут быть установлены в конфигурации.