Нужна ли реализация 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/