GridGain Tutorial 1
Grid computing to przetwarzanie rozproszone. Przez "przetwarzanie" rozumiemy różnego rodzaju akcje, obliczenia, operacje na danych, tłumaczenie tekstu, cokolwiek może zrobić komputer. "Rozproszone" oznacza fakt, że jest ono wykonywane na różnych komputerach, w różnych miejscach. Po co? Po to, by podzielić się pracą i szybciej uzyskać wynik końcowy.
Nie chcę się tutaj za bardzo na ten temat rozpisywać, zasobów na temat przetwarzania rozproszonego jest dość dużo:
- http://en.wikipedia.org/wiki/Grid_computing
- http://www.globus.org/alliance/publications/papers/anatomy.pdf
- http://binboy.sphere.pl/index.php?show=166
Tutaj chciałbym przedstawić serię artykułów na temat framework'u GridGain. GridGain jest infrastrukturą pozwalającą na pisanie aplikacji rozproszonych w Javie w możliwie najprostszy sposób. W pierwszym przykładzie napiszemy proste zadanie, które będzie uruchamiane na zdalnych węzłach. Póki co nie będzie żadnego dzielenia pracy - chcemy tylko pokazać, jak łatwo uruchomić zadanie w sieci.
Przede wszystkim pobieramy GridGain. Ja wykorzystuję wersję w paczce zip dla Windows'a. Po rozpakowaniu paczki musimy jedynie ustawić zmienne środowiskowe:
- JAVA_HOME wskazująca na JRE/JDK
- GRIDGAIN_HOME wskazująca na katalog z rozpakowanym GridGain
Z podkatalogu bin uruchamiamy skrypt gridgain.bat i już. Pierwszy węzeł naszej sieci już działa.
Teraz uruchamiamy swoje ulubione IDE (u mnie Eclipse). Tworzymy sobie nowy projekt. Tworzymy dwie klasy:
package pl.mrozewski.gridgain;
import pl.mrozewski.gridgain.task.SimpleGridifyTask;
public class GridGainExample1 {
public static void main(String[] args) {
SimpleGridifyTask task = new SimpleGridifyTask();
task.sayIt("Hello world!");
}
}
package pl.mrozewski.gridgain.task;
import java.io.Serializable;
public class SimpleGridifyTask implements Serializable {
private static final long serialVersionUID = 1L;
public void sayIt(String arg) {
System.out.println(arg);
}
}
Pierwsza klasa wywołuje tylko drugą. Druga klasa to nasze zadanie, które przyjmuje argument typu String i go wypisuje. A jak zamienić ten przykład na uruchamiany w sieci? Trzeba dopisać troszkę kodu w pierwszej klasie:
package pl.mrozewski.gridgain;
import org.gridgain.grid.GridException;
import org.gridgain.grid.GridFactory;
import pl.mrozewski.gridgain.task.SimpleGridifyTask;
public class GridGainExample1 {
public static void main(String[] args) {
try {
GridFactory.start();
SimpleGridifyTask task = new SimpleGridifyTask();
task.sayIt("Hello world!");
} catch (GridException e) {
e.printStackTrace();
} finally {
boolean cancelJobs = true;
GridFactory.stop(cancelJobs);
}
}
}
Co stało się w tej klasie?
- GridFactory.start() - uruchamia naszą sieć
- GridFactory.stop(true) - zatrzymuje naszą sieć anulując aktualnie wykonywane prace
A w drugiej klasie dodajemy jedynie adnotację @Gridify do naszej metody.
package pl.mrozewski.gridgain.task;
import java.io.Serializable;
public class SimpleGridifyTask implements Serializable {
private static final long serialVersionUID = 1L;
@Gridify
public void sayIt(String arg) {
System.out.println(arg);
}
}
Oznaczenie metody tą adnotacją jest jednym z kilku dostępnych sposobów na uruchamianie zadań w sieci. Ten akurat wykorzystuje AspecjJ AOP. Wymaga to dodania dwóch rzeczy do naszego uruchomienia:
- parametru dla maszyny wirtualnej -javaagent:[GRIDGAIN_HOME]/libs/aspectjweaver-1.5.3.jar
- dodania do classpath ścieżki [GRIDGAIN_HOME]/config/aop/aspectj
Gdy teraz uruchomimy nasz przykład nasze zadanie powinno zostać wykonane na losowo wybranym zdalnym węźle (jeśli pracujemy na jednym komputerze, to będzie to oczywiście ten sam komputer). Jeśli jesteśmy w posiadaniu dwóch komputerów wpiętych do tej samej sieci lokalnej, możemy zatrzymać węzeł na komputerze, na którym uruchamiamy przykład, a wystartować na tym drugim.
Prawda, że poszło (w miarę) łatwo? Warto wspomnieć o kilku rzeczach, które na pierwszy rzut oka nie są takie oczywiste:
- Jak to się stało, że automatycznie, bez konfigurowania, kopiowania klas wszystko zadziałało? W domyślnej konfiguracji węzły działają w sieci lokalnej wykorzystując multicast. Gdy węzeł się uruchamia/zatrzymuje, sam rozgłasza na ten temat informacje. Dla pierwszych testów jest to świetna sprawa, potem można to oczywiście zmienić.
- Większość dokumentacji jest trzymana w Javadoc'ach
Nie ma lania wody i artykułów (poza kilkoma przykładami i umiarkowaną ilością"teorii"). Warto zajrzeć od razu do Javadoc'ów, od razu rzuci się nam w oczy START HERE
W kolejnym wpisie na temat GridGain spróbujemy podzielić się pracą pomiędzy węzłami. Spróbujemy też zmierzyć trochę czasów, żeby przekonać się, czy faktycznie coś zyskujemy.