2015-03-25 2 views
0

Я читал в нескольких местах, что единственный способ повторить итерацию через значения в редукторе - это кешировать эти значения.Итерация дважды через значения в Reducer Hadoop

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

Что делать, если вам нужно повторить итерацию дважды, но у вас нет роскоши кешировать значения в памяти?

Есть ли какое-нибудь обходное решение?

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


Чтобы быть более конкретным с моим вопросом, вот что мне нужно сделать:

  • Reducer получает определенное количество очков (на пример - точки в 3D-пространстве с й, у, г координаты)
  • Одна случайная точка между ними должна быть выбрана - давайте назовем это FirstPoint
  • Редуктор должен тогда найти точку, наиболее удаленную от FirstPoint, чтобы сделать это нужно перебирать все значения - таким образом мы получаем secondPoint
  • После этого, редуктор должен найти наиболее удаленную точку от secondPoint, поэтому есть необходимость перебрать набор данных снова - таким образом мы получаем thirdPoint
  • Расстояния от thirdPoint к другим точкам необходимо вычислить

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

Это не проблема для буферизации этих расстояний, поскольку каждое расстояние является двойным, а точка может быть точкой в ​​n-мерном пространстве, поэтому каждая точка может иметь n координат, поэтому она может занимать слишком много места.

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

+0

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

+0

Спасибо за ваш интерес, я обновил свой вопрос. – Marko

+0

Возможно, вам придется прибегнуть к нескольким заданиям MapReduce, по одному для каждой итерации. К сожалению, итеративные алгоритмы не очень велики в MapReduce из-за сериализации большого диска, затраченного на каждую работу. В этих случаях Spark часто является лучшей основой для использования, поскольку результаты между задачами (обычно) остаются только в памяти. –

ответ

0

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

+0

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