Я пытался использовать Hadoop для отправки суммы N строк к единственному отображению. Я не требую, чтобы строки уже были разделены.
Я попытался использовать NLineInputFormat, однако который отправляет строки N текста от данных до каждого картопостроителя одна строка за один раз [сдающийся после Энной строки].
Я попытался установить опцию, и она только проводит строки N входа, отправляющего его в 1 строке за один раз к каждой карте:
job.setInt("mapred.line.input.format.linespermap", 10);
Я нашел список рассылки, рекомендующий мне переопределять LineRecordReader:: затем, однако это не настолько просто как это, внутренние элементы данных являются все частными.
Я только что проверил источник на NLineInputFormat, и он трудно кодирует LineReader, таким образом переопределение не поможет.
Кроме того, btw я использую Hadoop 0.18 для совместимости с Amazon EC2 MapReduce.
Вы должны реализовать свой собственный формат ввода . Тогда у вас также есть возможность определить собственное устройство чтения записей.
К сожалению, вам нужно определить метод 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);
}