Лабораторная работа №4
Разработка распределенного приложения с использованием платформы Apache Ignite. Необходимо разработать параллельный вариант алгоритма с применением подхода Grid Gain и платформа Apache Ignite, замерить время его работы.
Вариант и задание
17 Упорядочить строки матрицы по убыванию суммы их элементов.
Используемые технологии
- Java — основной язык программирования.
- Apache Ignite — распределённая обработка данных.
- Maven — система сборки.
Описание классов и методов
Класс MatrixSortAlgorithm
Этот класс является точкой входа в программу. Он запускает узел Apache Ignite, распределяет задачи вычисления сумм строк по узлам и выполняет сортировку матрицы.
Методы:
main(String[] args)— основной метод программы, который:- Настраивает Ignite и запускает узел.
- Проверяет, является ли узел главным.
- Генерирует матрицу случайных чисел.
- Распределяет вычисления сумм строк среди узлов.
- Выполняет сортировку строк по убыванию суммы элементов.
sumRow(int[] row): int— вычисляет сумму элементов строки.isMainNode(Ignite ignite): boolean— проверяет, является ли узел главным.waitForNodes(Ignite ignite, int expectedNodes)— ожидает подключения всех узлов.
Класс MatrixSumJob
Представляет задачу вычисления сумм строк матрицы для заданного диапазона.
Методы:
execute(): Object— вычисляет суммы строк и возвращает результат в видеMap<Integer, Integer>(номер строки → сумма элементов).cancel()— метод отмены задачи (не реализован).
Класс MatrixSumTask
Отвечает за распределение работы между узлами, сбор и объединение результатов.
Методы:
map(List<ClusterNode> subgrid, Void arg): Map<? extends ComputeJob, ClusterNode>— отправляет вычисления на один из узлов.result(ComputeJobResult res, List<ComputeJobResult> received): ComputeJobResultPolicy— указывает, что нужно ждать остальные результаты.reduce(List<ComputeJobResult> results): Map<Integer, Integer>— объединяет полученные суммы строк в один результат.
Как запустить
- Собрать проект с помощью Maven:
mvn clean package - Запустить программу:
java -jar target/MatrixSortAlgorithm-1.0-SNAPSHOT.jar
Вывод программы
Главный узел
```
Главный узел: ожидание подключения всех узлов...
Подключено узлов: 1 (ожидается: 3)
Подключено узлов: 1 (ожидается: 3)
Подключено узлов: 1 (ожидается: 3)
Подключено узлов: 2 (ожидается: 3)
Подключено узлов: 2 (ожидается: 3)
Все узлы подключены!
Отправка задачи на обработку строк с 0 по 332
Отправка задачи на обработку строк с 333 по 665
Отправка задачи на обработку строк с 666 по 999
Сортировка строк на главном узле...
Обработка строк с 0 по 332
Строка 0: сумма = 4969706
Строка 1: сумма = 5014926
Строка 2: сумма = 5040574
Строка 3: сумма = 4881031
......
Строка 330: сумма = 4962740
Строка 331: сумма = 5011460
Строка 332: сумма = 5071628
Матрица отсортирована по убыванию суммы элементов строк.
Общее время выполнения: 9937 мс
[09:57:10] Ignite node stopped OK [uptime=00:01:10.469]
```
Рабочие узлы (аналогично для всех)
```
Узел запущен: [0:0:0:0:0:0:0:1%lo, 127.0.0.1, 192.168.16.118]
Ожидание стабилизации подключения...
Рабочий узел готов к выполнению задач.
Обработка строк с 666 по 1000
Строка 666: сумма = 5127706
Строка 667: сумма = 4979571
Строка 668: сумма = 4986270
Строка 669: сумма = 4973940
......
Строка 998: сумма = 4898533
Строка 999: сумма = 5091439
Строка 1000: сумма = 4916796
[09:57:35] Ignite node stopped OK [uptime=00:00:10.203]
```
Вывод по работе
В данной работе был реализован распределённый алгоритм сортировки строк матрицы с использованием Apache Ignite. В сравнении с реализацией этой же задачи на MPI во второй лабе, Ignite показал удобство в управлении вычислениями благодаря встроенной системе распределения задач и отказоустойчивости. Однако, время выполнения оказалось выше, что объясняется сетевыми задержками и затратами на создание процессов. MPI, напротив, быстрее за счёт непосредственного обмена сообщениями, но требует сложной настройки окружения, что не всегда удобно и возможно. Выбор технологии зависит от задач пользователя.