Как создать пару ключ-значение в программе mapreduce, если значения хранятся за пределами границ?

Во входном файле, который мне нужно обработать, есть данные, классифицированные по заголовкам и соответствующим записям. Мой файл размером 200 МБ имеет 3 таких заголовка, а его записи разделены на 4 блока (3 * 64 МБ и 1 * 8 МБ).

Данные будут в формате ниже

HEADER 1
Record 1
Record 2
.
.
Record n
HEADER 2
Record 1
Record 2
.
.
Record n
HEADER 3
Record 1
Record 2
.
.
Record n

Все, что мне нужно, это взять HEADER в качестве ключа и нижележащие Records в качестве значений и обработать некоторые операции в моем коде сопоставления.

Проблема здесь в том, что мои записи разделены на разные блоки. Предположим, что мой первый заголовок и соответствующие ему записи занимают место в 70 МБ, это означает, что он занимает 64 МБ в первом блоке и 6 МБ во втором блоке.

Теперь, как картограф, который работает на 2-м блоке, знает, что 6 МБ файла принадлежат записям ЗАГОЛОВКА 1.

Может ли кто-нибудь объяснить мне, как полностью получить заголовок и его записи.


person Vamsinag R    schedule 28.09.2015    source источник
comment
Я попытался ответить на нечто подобное здесь: stackoverflow.com/questions/32758322/   -  person YoungHobbit    schedule 28.09.2015
comment
@YoungHobbit Я думаю, что проблема здесь в неизвестном количестве записей после заголовка, а также в объединении заголовка и записи.   -  person Ramzy    schedule 29.09.2015


Ответы (3)


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

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

Надеюсь, что эта ссылка ниже может быть полезной Как записи процесса Hadoop разделяются между границы блока?

person Abhinay    schedule 28.09.2015

У вас есть два пути:

  1. Единый сопоставитель, обрабатывающий все записи, поэтому у вас есть полные данные в одном классе, и вы сами решаете, как их разделить. Учитывая размер ввода, это будет иметь проблемы с производительностью. Дополнительная информация в Полном руководстве Hadoop, Типы и форматы MR, Форматы ввода, Предотвращение разделения. Меньше усилий по кодированию, и если у вашего картографа меньше данных и он часто работает, этот подход подходит.

  2. Если вы планируете использовать специальное средство чтения с разделением и записью, вы изменяете способ работы платформы. Потому что ваши записи похожи на TextInputFormat. Так что в основном нет необходимости планировать пользовательский считыватель записей. Однако вам необходимо определить, как производится расщепление. Как правило, разбиения делятся в основном на равные по размеру блоки, чтобы воспользоваться преимуществами локальности данных. В вашем случае ваши данные (в основном часть заголовка) могут заканчиваться в любом блоке, и вы должны соответствующим образом разделить. Все вышеперечисленные изменения необходимо внести, чтобы карта работала с имеющимися у вас данными.

person Ramzy    schedule 29.09.2015

Вы можете увеличить размер блока HDFS по умолчанию до 128 МБ, и если файл небольшой, он будет восприниматься как один блок.

person Ajay Gupta    schedule 29.09.2015