2013-06-24 9 views
0

Я использую Mapper для загрузки большого количества данных, которые имеют время выполнения и большой запрос, связанный с ним .. Мне просто нужно найти 1000 самых дорогих запросов , поэтому я пишу время выполнения как ключ к выводу моего картографа. Я использую 1 редуктор и хочу записать только 1000 записей, а редуктор - прекратить обработку.В MapReduce как остановить редуктор после обработки записей X

я могу иметь глобальный счетчик и сделать это если (количество < 1000) { context.write (ключ, значение) }

Но это все равно будет загружать все миллиарды записей, а потом не писать их.

Я хочу, чтобы редуктор остановился после плевки 1000 записей. Там, избегая времени поиска и времени чтения для следующего набора записей.

Возможно ли это?

ответ

5

Вы можете полностью ярлык редуктора путем переопределения реализации по умолчанию Reducer.run() метода:

public void run(Context context) throws IOException, InterruptedException { 
    setup(context); 
    while (context.nextKey()) { 
    reduce(context.getCurrentKey(), context.getValues(), context); 
    } 
    cleanup(context); 
} 

Вы должны быть в состоянии изменить время цикла, чтобы включить свой счетчик следующим образом:

public void run(Context context) throws IOException, InterruptedException { 
    setup(context); 
    int count = 0; 
    while (context.nextKey() && count++ < 1000) { 
    reduce(context.getCurrentKey(), context.getValues(), context); 
    } 
    cleanup(context); 
} 

Не то, чтобы это не обязательно выводило верхние большинство записей, а только первые 1000 записей с ключами (и не будет работать, если ваша реализация уменьшения выводит больше одной записи - в этом случае вы можете увеличить счетчик в методе уменьшения)

+0

Удивительно это сработало .. спасибо ... – mm93rc213v