У меня одновременно работает множество JobControls, все с одним и тем же набором ControlledJobs. Каждый JobControl имеет дело с различным набором входных/выходных файлов в зависимости от диапазона дат, но все они одного типа. Проблема, которую я наблюдаю, заключается в том, что шаги сокращения получают данные, предназначенные для обработки редюсером, обрабатывающим другой диапазон дат. Диапазон дат задается заданием, используется для определения ввода и вывода и считывается из контекста в редюсере.
Это останавливается, если я последовательно отправляю JobControls, но это бесполезно. Это то, что я должен решать с помощью специального разделителя? Как мне вообще определить правильный редуктор для ключа, если я не знаю, какой редуктор имеет дело с моим текущим диапазоном дат? Почему созданные редукторы не будут привязаны к их JobControl?
Я пишу все JobControls, Jobs, Maps и Reduces против их базовых реализаций на Java.
Я использую 2.0.3-альфа с пряжей. Может ли это иметь какое-то отношение к этому?
Я должен быть немного осторожен, делясь кодом, но вот очищенный картограф:
protected void map(LongWritable key, ProtobufWritable<Model> value, Context context)
throws IOException, InterruptedException {
context.write(new Text(value.get().getSessionId()),
new ProtobufModelWritable(value.get()));
}
И Редуктор:
protected void reduce(Text sessionId, Iterable<ProtobufModelWritable> models, Context context)
throws IOException, InterruptedException {
Interval interval = getIntervalFromConfig(context);
Model2 model2 = collapseModels(Iterables.transform(models, TO_MODEL));
Preconditions.checkArgument(interval.contains(model2.getTimeStamp()),
"model2: " + model2 + " does not belong in " + interval);
}
private Interval getIntervalFromConfig(Context context) {
String i = context.getConfiguration().get(INTERVAL_KEY);
return Utils.interval(i);
}
N
раз, каждый раз для другого интервала. Используя этот подход, вам нужна только одна работа, и редукторы будут вычислять желаемый результат параллельно. - person harpun   schedule 20.03.2013