Несколько строк текста к единственной карте

Я пытался использовать Hadoop для отправки суммы N строк к единственному отображению. Я не требую, чтобы строки уже были разделены.

Я попытался использовать NLineInputFormat, однако который отправляет строки N текста от данных до каждого картопостроителя одна строка за один раз [сдающийся после Энной строки].

Я попытался установить опцию, и она только проводит строки N входа, отправляющего его в 1 строке за один раз к каждой карте:

    job.setInt("mapred.line.input.format.linespermap", 10);

Я нашел список рассылки, рекомендующий мне переопределять LineRecordReader:: затем, однако это не настолько просто как это, внутренние элементы данных являются все частными.

Я только что проверил источник на NLineInputFormat, и он трудно кодирует LineReader, таким образом переопределение не поможет.

Кроме того, btw я использую Hadoop 0.18 для совместимости с Amazon EC2 MapReduce.

7
задан monksy 26 April 2010 в 04:13
поделиться

1 ответ

Вы должны реализовать свой собственный формат ввода . Тогда у вас также есть возможность определить собственное устройство чтения записей.

К сожалению, вам нужно определить метод getSplits (). На мой взгляд, это будет сложнее, чем реализовать программу чтения записей: этот метод должен реализовывать логику для фрагментации входных данных.

См. Следующий отрывок из «Hadoop - Полное руководство» (отличная книга, которую я всегда рекомендую!):

Вот интерфейс:

public interface InputFormat<K, V> {
  InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
  RecordReader<K, V> getRecordReader(InputSplit split,
                                     JobConf job, 
                                     Reporter reporter) throws IOException;
}

JobClient вызывает метод getSplits (), передавая желаемое количество map tasks в качестве аргумента numSplits. Это число рассматривается как подсказка, поскольку InputFormat реализует - выражения могут возвращать другое количество разделений, отличное от числа, указанного в numSplits. Вычислив разделения, клиент отправляет их в средство отслеживания заданий, которое использует свои места хранения для планирования задач карты для их обработки в средствах отслеживания заданий.

В системе отслеживания задач задача карты передает разделение методу getRecordReader () на InputFormat, чтобы получить RecordReader для этого разделения. RecordReader - это не более чем итератор по записям, и задача карты использует его для генерации пар ключ-значение записи, которые она передает функции карты. Фрагмент кода (на основе кода в MapRunner) иллюстрирует идею:

K key = reader.createKey();
V value = reader.createValue();
while (reader.next(key, value)) {
  mapper.map(key, value, output, reporter);
} 
7
ответ дан 7 December 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: