Многократное повторение значения ввода текста в редюсере в задании MapReduce

У меня есть два очень больших набора данных (таблицы) в HDFS. Я хочу объединить их в некоторых столбцах, затем сгруппировать их в некоторых столбцах, а затем выполнить некоторые групповые функции в некоторые столбцы.

Мои шаги:

1- Создайте два задания.

2- В первом задании в картографе считываются строки каждого набора данных в качестве входного значения карты и выдаются значения столбцов соединения в качестве выходного ключа карты и значения остальных столбцов в качестве карты. выходное значение.

После сопоставления платформа MapReduce выполняет перетасовку и группирует все выходные значения карты в соответствии с выходными ключами карты.

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

Что я хочу, так это многократно повторять уменьшение входного значения, чтобы я мог выполнить декартово произведение.

Проиллюстрировать:

Допустим, для ключа соединения x у меня есть 100 совпадений из одного набора данных и 200 совпадений из другого. Это означает, что объединение их по ключу соединения x дает комбинацию 100 * 200 = 20000. Я хочу испустить NullWritable как уменьшить выходной ключ и каждое декартово произведение как уменьшить выходное значение.

Пример вывода может быть:

для ключа соединения x:

Из (nullWritable), (первый (1), второй (1))

Более (nullWritable), (первый (1), второй (200))

Кому (nullWritable), (первый (100), второй (200))

Как это сделать?

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

3- Если я это сделаю, я запущу второе задание, которое использует файл результатов первого задания в качестве входного файла. В картографе я выдаю значения групповых столбцов в качестве выходного ключа карты, а значения остальных столбцов - в качестве выходного значения карты. Затем в редукторе, перебирая значение каждого ключа, я выполняю некоторые функции для некоторых столбцов, таких как сумма, среднее, максимальное, минимальное.

Заранее большое спасибо.


person digitalmert    schedule 31.08.2014    source источник


Ответы (1)


Поскольку ваше первое задание MR использует ключ соединения в качестве ключа вывода карты, ваш 1-й редуктор будет получать значения (K join_key, List‹ V>) для каждого вызова сокращения. Что вы можете сделать, так это просто разделить значения на два отдельных списка, каждый для источника данных, и использовать вложенный цикл for для создания декартова произведения.

person yjshen    schedule 31.08.2014
comment
Генри, спасибо за ответ. Но как я могу разделить их, не загружая их в память? - person digitalmert; 31.08.2014
comment
@digitalmert, я думаю, что значения уже загружены в память, поскольку все они существуют в списке. Вы имеете в виду, что ваши оба файла огромны, а кардинальность ключа соединения действительно мала, и это вызовет ошибку OOM даже с фиктивным редуктором? - person yjshen; 01.09.2014
comment
да. Поскольку значение ключа соединения может включать много строк из обоих файлов, это значение может не поместиться в памяти. Для ключа x значение может включать миллионы строк из других таблиц. Если я попытаюсь извлечь строки одной таблицы в память, а затем выполнить перекрестное производство, это может вызвать ошибку нехватки памяти. По соображениям масштабируемости я не хочу этого делать. Есть ли способ, который вы можете предложить для этого случая? - person digitalmert; 01.09.2014