Лабораторная работа №4
Тема:
Разработка распределенного приложения с использованием платформы Apache Ignite.
Цель работы:
Разработать параллельный вариант алгоритма с применением подхода Grid Gain и платформы Apache Ignite, замерить время его работы.
Используемые технологии:
- Java — основной язык программирования.
- Apache Ignite — платформа для распределенной обработки данных.
- Maven — система сборки проекта.
Процесс установки и запуска
1. Сборка проекта
Перейти в директорию проекта и выполнить:
mvn clean package
Убедиться, что файл конфигурации conf.xml находится в рабочей директории рядом с .jar файлом.
2. Установка Apache Ignite на другие контейнеры
- Скачать Apache Ignite (binary release) с официального сайта: https://ignite.apache.org/download.cgi
- Распаковать архив.
- Поместить ваш
conf1.xmlв директорию/configIgnite. - Внести корректные IP-адреса ваших узлов в конфигурационный файл (указать все узлы, которые будут участвовать в кластере).
3. Запуск Ignite на других узлах
Перейти в папку /bin Ignite на другом контейнере (не том, где будет запускаться .jar) и выполнить:
ignite.sh -i
или для Windows:
ignite.bat -i
Выбрать ваш conf1.xml при запуске.
4. Запуск основного приложения
Выбрать один из контейнеров для запуска основного .jar файла:
java -jar [имя_файла].jar [размер_матрицы]
где [размер_матрицы] — целое число, определяющее размер квадратной матрицы.
Описание кода и комментарии
Основной метод запуска:
public static void main(String[] args) {
String workingDir = System.getProperty("user.dir") + "/conf.xml"; // файл конифгурации должен лежать в рабочей папке
int size = Integer.parseInt(args[args.length - 1]); // размер матрицы передаем как аргумент
try (Ignite ignite = Ignition.start(workingDir)) { // стартуем ignite с указанным конфигом
int[][] matrix = new int[size][size];
Random r = new Random();
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
matrix[i][j] = r.nextInt(100);
}
}
long start = System.nanoTime();
Integer totalSum = ignite.compute().execute(new MatrixSumTask(), matrix); // запускаем распределение задачи через ignite
System.out.println("Сумма произведений строк (Ignite): " + totalSum + " за время: " + (System.nanoTime() - start));
}
}
Класс задачи, который отвечает за распределение строк матрицы между узлами:
public static class MatrixSumTask extends ComputeTaskSplitAdapter<int[][], Integer> { // класс распределения строк матрицы
@IgniteInstanceResource
private Ignite ignite; // подключение к ignite
@Override
protected Collection<ComputeJob> split(int gridSize, int[][] matrix) { // метод разделения задачи на подзадачи
List<ComputeJob> jobs = new ArrayList<>();
for (int[] row : matrix) { // по каждой строке создаем отдельную задачу
jobs.add(new MatrixRowProductJob(row));
}
return jobs; // возвращаем список задач
}
@Override
public Integer reduce(List<ComputeJobResult> list) throws IgniteException { // метод сбора данных после выполнения задач
int totalSum = 0;
for (ComputeJobResult res : list) { // собираем суммы с каждого узла
totalSum += res.<Integer>getData();
}
return totalSum; // возвращаем итоговую сумму
}
}
Класс обработки строки матрицы (работает на каждом узле):
public static class MatrixRowProductJob implements ComputeJob { // объект таски
private final int[] row;
public MatrixRowProductJob(int[] row) {
this.row = row;
}
@Override
public Object execute() { // выполнение подсчета на узле
int sum = 1;
for (int value : row) {
sum *= value;
}
System.out.println("One thread result: " + sum);
return sum;
}
@Override
public void cancel() {} // отмена задачи (не используется)
}
Пример вывода программы при матрице 8x8
Первый процесс:
[18:04:37] Ignite node started OK (id=99ebfe87, instance name=my-cluster)
[18:04:37] Topology snapshot [ver=2, locNode=99ebfe87, servers=2, clients=0, state=ACTIVE, CPUs=16, offheap=13.0GB, heap=8.8GB]
[18:04:37] ^-- Baseline [id=0, size=2, online=2, offline=0]
One thread result: 3175200
One thread result: 13297284
Сумма произведений строк (Ignite): 36023394 за время: 86892329
[18:04:37] Ignite node stopped OK [name=my-cluster, uptime=00:00:00.267]
Второй процесс:
[18:04:36] ^-- Baseline [id=0, size=2, online=2, offline=0]
One thread result: 19376190
One thread result: 174720
Вывод по лабораторной работе
В ходе выполнения лабораторной работы был разработан и запущен распределенный алгоритм для параллельного подсчета суммы произведений строк матрицы с использованием платформы Apache Ignite.
Способ показал себя довольно хорошо
Он отработал стабильнее чем mpj, и не было ошибок переполнения памяти. Видимо игнит более умно ей распоряжается
Вывод положительный