Я читал в нескольких местах, что единственный способ повторить итерацию через значения в редукторе - это кешировать эти значения.Итерация дважды через значения в Reducer Hadoop
Но также существует ограничение на то, что все значения должны входить в основную память в этом случае.
Что делать, если вам нужно повторить итерацию дважды, но у вас нет роскоши кешировать значения в памяти?
Есть ли какое-нибудь обходное решение?
Возможно, есть некоторые ответы на эту проблему, но я новичок в Hadoop, поэтому я уверен, что некоторое решение было найдено с тех пор, как были заданы вопросы.
Чтобы быть более конкретным с моим вопросом, вот что мне нужно сделать:
- Reducer получает определенное количество очков (на пример - точки в 3D-пространстве с й, у, г координаты)
- Одна случайная точка между ними должна быть выбрана - давайте назовем это FirstPoint
- Редуктор должен тогда найти точку, наиболее удаленную от FirstPoint, чтобы сделать это нужно перебирать все значения - таким образом мы получаем secondPoint
- После этого, редуктор должен найти наиболее удаленную точку от secondPoint, поэтому есть необходимость перебрать набор данных снова - таким образом мы получаем thirdPoint
- Расстояния от thirdPoint к другим точкам необходимо вычислить
Расстояния от secondPoint до всех остальных точек и расстояния от третьего пункта до всех остальных точек необходимо сохранить, чтобы можно было выполнить дополнительные действия.
Это не проблема для буферизации этих расстояний, поскольку каждое расстояние является двойным, а точка может быть точкой в n-мерном пространстве, поэтому каждая точка может иметь n координат, поэтому она может занимать слишком много места.
Мой первоначальный вопрос состоял в том, как я могу повторить два раза, но мой вопрос более общий, как вы можете повторять несколько раз через значения, чтобы выполнить описанные выше шаги?
Вам нужно будет предоставить более конкретную информацию о том, что вы пытаетесь выполнить, повторяя дважды. Если вам необходимо выполнить итерацию по каждому набору сгруппированных записей дважды в течение одного вызова для уменьшения, вам нужно как-то их (как в памяти, так и в файле) их буферизовать. –
Спасибо за ваш интерес, я обновил свой вопрос. – Marko
Возможно, вам придется прибегнуть к нескольким заданиям MapReduce, по одному для каждой итерации. К сожалению, итеративные алгоритмы не очень велики в MapReduce из-за сериализации большого диска, затраченного на каждую работу. В этих случаях Spark часто является лучшей основой для использования, поскольку результаты между задачами (обычно) остаются только в памяти. –