Files
2025-03-24 10:52:11 +04:00
..
2025-03-21 18:11:45 +08:00
2025-03-21 18:11:45 +08:00
2025-03-21 18:11:45 +08:00
2025-03-21 18:11:45 +08:00
2025-03-24 10:52:11 +04:00

Лабораторная работа №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 в директорию /config Ignite.
  • Внести корректные 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, и не было ошибок переполнения памяти. Видимо игнит более умно ей распоряжается

Вывод положительный