Я пытаюсь выполнить некоторые численные вычисления на большом распределенном наборе данных. Алгоритмы хорошо соответствуют модели MapReduce с дополнительным свойством, заключающимся в том, что выходные данные шага карты имеют небольшой размер по сравнению с входными данными. Данные могут считаться доступными только для чтения и статически распределяться по узлам (за исключением повторной балансировки при отработке отказа). Обратите внимание, что это несколько противоречит стандартным примерам подсчета слов, где входные данные отправляются узлам, выполняющим шаг сопоставления.
Это означает, что шаг карты должен выполняться параллельно на всех узлах, обрабатывая локальные данные каждого узла, в то время как допустимо, чтобы выходные данные шага карты отправлялись на один узел для шага сокращения.
Как лучше всего реализовать это с помощью GridGain?
Кажется, в более ранних версиях GridGain был метод reduce
(..) для интерфейсов GridCache
/GridCacheProjection
, но его больше нет. Есть ли замена? Я думаю о механизме, который берет закрытие карты и выполняет его, распределенное по каждому элементу данных ровно один раз, избегая при этом копирования каких-либо входных данных по сети.
(Несколько ручной) подход, который я придумал до сих пор, заключается в следующем:
public class GridBroadcastCountDemo {
public static void main(String[] args) throws GridException {
try (Grid grid = GridGain.start(CONFIG_FILE)) {
GridFuture<Collection<Integer>> future = grid.forRemotes().compute().broadcast(new GridCallable<Integer>() {
@Override
public Integer call() throws Exception {
GridCache<Integer, float[]> cache = grid.cache(CACHE_NAME);
int count = 0;
for (float[] array : cache.primaryValues()) {
count += array.length;
}
return count;
}
});
int totalCount = 0;
for (int count : future.get()) {
totalCount += count;
}
// expect size of input data
System.out.println(totalCount);
}
}
}
Однако нет гарантии, что при таком подходе каждое значение будет обработано ровно один раз. Например. когда происходит повторная балансировка во время выполнения GridCallable
, часть данных может обрабатываться ноль или несколько раз.