Admin
02.09.2016

Начнем с того что же такое грид.
Грид – географически распределенная инфраструктура, объединяющая множество ресурсов разных типов (проц… ессоры, долговременная и оперативная память, хранилища и базы данных, сети), доступ к которым пользователь может получить из любой точки, независимо от места их расположения. Грид предполагает коллективный разделяемый режим доступа к ресурсам и к связанным с ними услугам в рамках глобально распределенных виртуальных организаций, состоящих из предприятий и отдельных специалистов, совместно использующих общие ресурсы. В каждой виртуальной организации имеется своя собственная политика поведения ее участников, которые должны соблюдать установленные правила. Виртуальная организация может образовываться динамически и иметь ограниченное время существования.
Другими словами грид — это технология позволяющая из множества мало мощных компьютеров программным путем сделать много функциональный и мощный сервер или другую желаемую вычислительную систему.
Алгоритм шифрования данных (DES) был взломан с помощью огромной сети, состоящей из десятков тысяч компьютеров через 39 дней. Компьютер который подобрал нужный ключ был мощностью 90 мегагерц с 16мб оперативной памяти.
На сегодняшний день грид технологии имеют бурное развитие, так например в Церне (создатели большого адронного коллаидера) используется данная технология для обработки данных с датчиков, с которых скорость поступления данных ~700мб/сек.
На рынке представлено множество решений для написания программ поддерживающий данную концепцию, но хотелось бы остановиться на программном продукте GridGain. Плюсы гридгейна это бесплатность, открытый код, кросплатформеность, Питерская команда разработчиков (хоть и не ориентированна на русских разработчиков, да и как таковой российский рынок IT). Вот как они позиционируют сами себя:
GridGain – это вычислительный грид уровня предприятия, предназначенный для решения проблем организации вычислительных ресурсов, с целью их более полного использования и, как следствие, повышения эффективности всей системы в целом. За этой, на первый взгляд, «мудреной» фразой скрывается простой и дружественный продукт для распараллеливания различных вычислений. Причем продукт, изначально ориентированный для использования в бизнес приложениях с минимальным их изменением.
И так у GridGain не плохая архитектура с помощью которой его конфигурация представляется наиболее просто.

В данной схеме представлены все возможности по кофигурированию. GridGain можно настроить для работы в локальной сети, в определенном диапазоне айпи адресов, в интернете, т.е. фактически для любых нужд. Конфигурация грида выполняется посредством Spring файла. GridGain поставляется в набором готовых конфигурационных файлов которые могут быть найдены в каталоге [GRIDGAIN_HOME]/config.
Итак как же можно выполнить наш код на гриде? GridGain предоставляет три различных способа выполнения нашего кода на риде:
1. Аннотация Gridify.
2. Executor service.
3. Пользовательские задачи и подзадачи.
Пример кода с @Gridify:
Но для обработки этой аннотации необходимо использовать какой либо framework,
поддерживающий аспектное программирование. И GridGain поддерживает и поставляет
конфигурацию для AspectJ, Jboss и Spring.
Например для использования AspectJ вам необходимо включить в пути классов каталог
и добавить в строку запуска AOP агента:
Пример кода с GridGain executor service:
Как видно из примера GridGain нода была получена из Spring файла и у нее спользован
executor service.
Вот сам Spring file:
В данном случае нода использует конфигурацию по умолчанию.
Наиболее интересный и гибкий способ это «Пользовательские задачи и подзадачи». Суть данного способа это разбиение всей задачи на два класса GridTask и GridJob, в GridTask задача разбивается на нужное множество подзадач, которые будут распределены на найдены ноды, а в GridJob описывается сама задача которую нужно выполнить.
Пример с GridTask и GridJob решает задачу нахождения числа Pi с помощью метода Монте-Карло.
MainMonteGrid.java
public class MainMonteGrid {
public static void main(String[] args) throws GridException {
if (args.length == 0) {
GridFactory.start();
}
else {
GridFactory.start(args[0]);
}
try {
Grid grid = GridFactory.getGrid();
long time = System.currentTimeMillis();
GridTaskFuture
// Wait for task completion.
double Pi = future.get();
time = System.currentTimeMillis() — time;
System.out.println(«>>>»);
System.out.println(«>>> Finished executing Grid Pi = » + Pi + «; time = » + time + «;»);
System.out.println(«>>>»);
}
finally {
GridFactory.stop(true);
}
}
}
GridMonteTask.java
import java.util.*;
public class GridMonteTask extends GridTaskSplitAdapter
/** Auto-injected grid logger. */
@GridLoggerResource
private GridLogger log = null;
private int gridSize;
private long iteration;
@Override
public Collection extends GridJob> split(int gridSize, Integer iteration) throws GridException {
this.gridSize = gridSize;
this.iteration = iteration;
List
for(int i = 1; i <= gridSize; i++) {
jobs.add(new GridMontedJob(this.iteration));
}
return jobs;
}
/**
* @param results Job results.
* @return Pi passed into
* split(gridSize, iteration) method above.
* @throws GridException If reduce failed.
*/
public Double reduce(List
double total = 0;
int circle = 0;
for (GridJobResult res : results) {
circle = circle + (Integer)res.getData();
}
total = (circle / (double)this.gridSize);
total = (total / (double)this.iteration) * 4;
return total;
}
}
GridMontedJob.java
import org.gridgain.grid.GridException;
import org.gridgain.grid.GridJob;
public class GridMontedJob implements GridJob {
private long iteration;
public GridMontedJob(long iteration) {
this.iteration = iteration;
}
public void cancel() {
// TODO Автоматически созданная заглушка метода
}
public Serializable execute() throws GridException {
Random ran = new Random();
int circle = 0;
for(long i = 0; i < iteration; i++)
{
double tmpx = ran.nextDouble();
double tmpy = ran.nextDouble();
if((tmpx*tmpx + tmpy*tmpy) <= 1)
{
circle++;
}
}
return circle;
}
}
На моей Ubuntu OS с jdk 1.6.0_07 была замечена бага с работай функции System.getProperties(), которая не хотела возвращать переменные ОС в следствии чего не возможно было запускать программу, пришлось переписовать класс GridFactory и указывать в нем в явном виде домашнюю директорию с GridGain.
Источники.
GridGain
Число пи
Грид концепция