Нужна ли реализация Hadoop MapReduce RecordReader?

Из документа Apache об интерфейсе InputFormat Hadoop MapReduce:

" [L] Огическое разбиение на основе входного размера недостаточно для многих приложений, поскольку необходимо соблюдать границы записей. В таких случаях приложение должно также реализовать RecordReader, на котором лежит ответственность за соблюдение границ записей и представление записи. -ориентированный вид логического InputSplit для отдельной задачи."

Является ли пример приложения WordCount тем, в котором логические разбиения по размеру ввода недостаточны? Если да, то где в исходном коде найдена реализация RecordReader?

2 ответа

Решение

Входные данные являются логическими ссылками на данные. Если вы посмотрите на API, вы увидите, что он ничего не знает о границах записей. Маппер запускается для каждого входного разбиения. Картограф map() запускается для каждой записи (в программе WordCount каждая строка в файле).

Но как картограф знает, где находятся границы записей?

Вот где приходит ваша цитата из интерфейса ввода-вывода Hadoop MapReduce -

приложение должно также реализовать RecordReader, на котором лежит ответственность за соблюдение границ записей и представление ориентированного на запись представления логического InputSplit для отдельной задачи.

Каждый маппер связан с InputFormat. Тот InputFormat имеет информацию о которой RecordReader использовать. Посмотрите на API, вы обнаружите, что он знает о входных разделениях и о том, какой читатель записей использовать. Если вы хотите узнать больше о входных разделениях и программе чтения записей, вам следует прочитать этот ответ.

RecordReader определяет границы записи; InputFormat определяет что RecordReader используется.

Программа WordCount не указывает никаких InputFormat поэтому по умолчанию TextInputFormat который использует LineRecordReader и выдает каждую строку как отдельную запись. А это твой исходник


[L] Огическое разбиение на основе входного размера недостаточно для многих приложений, поскольку необходимо соблюдать границы записи.

Это означает, что для файла примера, такого как

a b c d e
f g h i j
k l m n o

и мы хотим, чтобы каждая строка была рекордной. когда логические разбиения основаны на размере входных данных, возможно, что могут быть два разбиения, такие как:

a b c d e
f g 

а также

    h i j 
k l m n 0 

Если бы не было RecordReader это было бы f g а также h i j быть разными записями; Очевидно, это не то, что нужно большинству приложений.

Отвечая на ваш вопрос, в программе WordCount не имеет значения, каковы границы записи, но есть вероятность, что одно и то же слово будет разбито на разные логические разбиения. Следовательно, логические разбиения по размеру недостаточны для программы WordCount.

Каждая программа MapReduce "уважает" границы записей. В противном случае, это не очень полезно.

Вы не можете увидеть реализацию RecorderReader в Примере WordCount, так как она использует RecordReader по умолчанию и InputSplit по умолчанию, указанные в платформе.

Если вы хотите увидеть их реализацию, вы можете найти ее в исходном коде Hadoop.

Для получения дополнительной информации о читателях Recorder и о том, как они работают, pl. см.: https://hadoopi.wordpress.com/2013/05/27/understand-recordreader-inputsplit/

Другие вопросы по тегам