Редукторы Hadoop получают неверные данные

У меня одновременно работает множество 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);
}

person Ben Smith    schedule 19.03.2013    source источник
comment
Можете ли вы уточнить немного больше? Какой тип ключа вы используете и можете ли вы показать нам свой код картографа?   -  person Thomas Jungblut    schedule 19.03.2013
comment
Привет, Томас, добавил код. Надеюсь, это поможет.   -  person Ben Smith    schedule 20.03.2013
comment
Прежде всего, спасибо за хорошо читаемый код +1! Однако вы устанавливаете интервал для всей работы. Поэтому, если у вас есть несколько редукторов, у вас просто будет одинаковый интервал во всех задачах редукции. Поэтому, если вам нужны разные интервалы в редьюсерах, вы должны переопределить разделитель с помощью логики разделения диапазона дат.   -  person Thomas Jungblut    schedule 20.03.2013
comment
Дело в том, что у меня есть отдельная работа для каждого интервала. Классы Job и Reduce одинаковы, но у них разные конфигурации, созданные для каждого экземпляра. Это означает, что несколько редюсеров одного и того же класса работают одновременно, но для разных задач.   -  person Ben Smith    schedule 20.03.2013
comment
Я бы выбрал подход, предложенный @ThomasJungblut - переопределить разделитель и разделить в соответствии с interval_key. В вашей задаче карты вы должны прочитать список желаемых интервалов из конфигурации и создать каждую запись N раз, каждый раз для другого интервала. Используя этот подход, вам нужна только одна работа, и редукторы будут вычислять желаемый результат параллельно.   -  person harpun    schedule 20.03.2013


Ответы (1)


Для справки, я исправил это двумя вещами. Самая главная проблема заключалась в том, что, создавая отдельные задания для каждого интервала, я давал им одинаковые имена. Добавляя сериализованный интервал к имени задания, Hadoop знал, каким редукторам отправлять результаты сопоставления.

Кроме того, я начал создавать отдельные объекты конфигурации для каждого задания, а не копировать исходную конфигурацию. Это, вероятно, не нужно, но, по крайней мере, я знаю, что не могу сделать ошибку и начать совместное использование одного и того же объекта конфигурации.

person Ben Smith    schedule 22.03.2013