Статьи

Вычислительные сетки — что ожидать?


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

Давайте возьмем
Облачный Акка например. Хотя API, читая этот блог, кажется довольно простым, назвать его
сеткой вычисленийскорее преувеличивает реальность. Я бы , вероятно , не идти дальше , чем называть его за то , что это —
в удобный Scala API для RPC .
Я сам

работал над
GridGain Compute Grid уже более 5 лет (а затем и над сеткой данных) и изучил немало других, вот некоторые особенности, которые, по моему мнению, минимально необходимы для любого продукта, прежде чем он сможет заявить о себе как
вычислить сетку .

  • Автоматическое обнаружение — все узлы в сетке должны автоматически обнаруживать друг друга, то есть пользователь никогда не должен вручную добавлять узлы в топологию.
  • MapReduce — поддержка разделения работы на несколько подзадач и последующей агрегации результатов просто обязательна. В противном случае вы перекладываете большую часть грязной работы на своих пользователей, что несправедливо.
  • Автоматическое обнаружение сбоев — вычислительная сетка должна быть достаточно умной, чтобы автоматически обнаруживать сбои узлов и пропорционально распределять всю нагрузку между оставшимися узлами.
  • Отказоустойчивость — все сбойные сеточные задания должны автоматически переключаться на другие узлы, которые лучше подходят для выполнения этих заданий.
  • Балансировка нагрузки — вычислительная сетка должна автоматически распределять нагрузку поровну между узлами, обычно используя множество различных политик для балансировки нагрузки. GridGain даже поддерживает похищение работ , когда менее загруженные узлы могут красть задания с перегруженных узлов.
  • Разрешение столкновений заданий — это дает пользователям контроль над тем, сколько заданий может выполняться параллельно, в то время как другие задания должны ждать в очередях ожидания, упорядоченных несколькими доступными стратегиями разрешения столкновений.
  • Автоматическое развертывание — пользователи вычислительных сеток никогда не должны принудительно развертывать свои библиотеки на всех доступных узлах сетки, это слишком неудобно и подвержено ошибкам. Подход, который мне нравится больше всего (доступен в GridGain) — это автоматическое развертывание, когда код просто автоматически проникает в сетку без каких-либо явных действий со стороны пользователей.
  • Вложенные задания и продолжения — задания вычислительной сетки должны иметь возможность вызывать другие задания вычислительной сетки при удаленном выполнении. Это очень мощная функция, особенно когда задания сетки являются рекурсивными. Продолжения должны позволять приостанавливать работу и высвобождать ее ресурсы, пока она ожидает результата другой работы в сетке.

Я мог бы продолжить, но я остановлюсь здесь. Я думаю, что очевидно, что вычислительные грид- продукты намного более продвинуты, чем платформы RPC . В качестве сравнения, вот примеры GridGain, реализованные в GridGain Scalar , которые упрощенно охватывают примеры, предоставленные Cloudy Akka, а также делают все другие классные вычислительные сетки в фоновом режиме:

scalar {
// 1. Execute a simple job on some remote node.
grid !!< (() => println("> GridGain ROCKS <"))

// 2. Execute a simple job on all remote nodes.
grid !!! (() => println("> GridGain ROCKS <"))

// 3. Use MapReduce to split a phrase into multiple words and
// print each word on remote nodes.
grid !!~ (for (w <- "GridGain ROCKS".split(" ")) yield () => println(w))

// 4. Use MapReduce to count number characters by spreading
// workload to the grid and reducing on local node.
val cnt = grid !*~ (for (w <- "GridGain REALLY ROCKS!".split(" "))
yield () => w.length, // Map step.
(s: Seq[Int]) => s.sum) // Reduce step.
}

С http://gridgain.blogspot.com/2011/02/compute-grids-what-to-expect.html