Files
никита покладов ea178e3e10 Update README.md
добавлено сравнение с MPI, но насчёт человечности не уверен (я попытался)
2025-03-22 11:42:43 +04:00
..
2025-03-18 18:53:04 +04:00
2025-03-18 18:53:04 +04:00
2025-03-18 18:53:04 +04:00
2025-03-22 11:42:43 +04:00

Лабораторная работа №4

Разработка распределенного приложения с использованием платформы Apache Ignite. Необходимо разработать параллельный вариант алгоритма с применением подхода Grid Gain и платформа Apache Ignite, замерить время его работы.

Вариант и задание

17 Упорядочить строки матрицы по убыванию суммы их элементов.

Используемые технологии

  • Java — основной язык программирования.
  • Apache Ignite — распределённая обработка данных.
  • Maven — система сборки.

Описание классов и методов

Класс MatrixSortAlgorithm

Этот класс является точкой входа в программу. Он запускает узел Apache Ignite, распределяет задачи вычисления сумм строк по узлам и выполняет сортировку матрицы.

Методы:

  • main(String[] args) — основной метод программы, который:
    1. Настраивает Ignite и запускает узел.
    2. Проверяет, является ли узел главным.
    3. Генерирует матрицу случайных чисел.
    4. Распределяет вычисления сумм строк среди узлов.
    5. Выполняет сортировку строк по убыванию суммы элементов.
  • 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> — объединяет полученные суммы строк в один результат.

Как запустить

  1. Собрать проект с помощью Maven:
    mvn clean package
    
  2. Запустить программу:
    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, напротив, быстрее за счёт непосредственного обмена сообщениями, но требует сложной настройки окружения, что не всегда удобно и возможно. Выбор технологии зависит от задач пользователя.