Реализация Распределенных Вычислений На Python С Использованием Технологии Docker.

Распределенные вычисления — это способ решения трудоемких вычислительных задач с использованием нескольких компьютеров, чаще всего объединенных в параллельную вычислительную систему.

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

Сотрудники исследовательского центра Xerox PARC Джон Шох и Джон Хапп написали программу, которая пересылала себя на другие работающие компьютеры через локальную сеть PARC. В дальнейшем, в связи с развитием и ростом количества персональных компьютеров, распределенные вычисления стали использоваться все шире.

Итак, в конце 1980-х годов Арьен Ленстра и Марк Менес написали программу факторизации длинных чисел.

Она отправляла задания на компьютеры участников по электронной почте и таким же образом принимала ответы.

Еще одним знаковым событием стало создание проекта SETI@Home (Search for Extra-Terrestrial Intelligence at Home) по поиску внеземного разума путем анализа данных радиотелескопов, в том числе на домашних компьютерах участников.

Этот проект был запущен в 1999 году и остановлен в 2020 году.

Эта распределенная система построена на платформе BOINC, созданной в Университете Беркли.

В дальнейшем разработки по созданию различных распределенных систем активно продолжались, и в настоящее время они используются в самых разных областях.

В частности, распределенные вычисления широко используются для решения математических задач.

Типичный пример — факторизация чисел (разложение их на произведение простых множителей).

Еще одна важная область применения распределенных вычислений — обработка больших данных с использованием методов машинного обучения и интеллектуального анализа данных.

В последние годы Python занял лидирующие позиции в качестве языка программирования для этой цели.

По состоянию на март 2020 года по рейтингу TIOBE Python находится на третьем месте, хотя еще в 2015 году он был лишь седьмым.

Одной из известных проблем языка Python является его относительно низкая производительность по сравнению с компилируемыми языками, такими как C++.

Этот недостаток является дополнительной причиной использования параллельного и распределенного программирования в процессе разработки.

Также во второй половине второго десятилетия XXI века стали набирать популярность такие технологии, как контейнеризация и микросервисы.

Благодаря программному обеспечению Docker и изолированным средам выполнения относительно легко запускать несколько приложений на одном сервере, полностью изолированных друг от друга и с собственными настройками среды выполнения.

В настоящее время технология Docker используется все шире и для самых разных целей, в том числе и при разработке программного обеспечения: она позволяет проводить различные эксперименты с зависимостями программного обеспечения, не засоряя при этом основную систему.

Основной инструмент кластеризации для Docker называется Docker Swarm. Он позволяет объединять узлы в единое кластерное пространство и распределять контейнеры по всему этому кластеру.

Представленная в этой статье разработка основана на изолированных Docker-контейнерах — «исполнителях».

Каждый исполнитель представляет собой асинхронный TCP-сервер, который работает следующим образом.

На первом этапе он десериализует полученные данные и получает объект задания.

Каждый такой объект содержит код функции, которую необходимо выполнить, а также значения ее входных данных.

Исполнитель запускает заданную функцию, используя определенную стратегию выполнения, после чего сериализует результат своей работы и возвращает полученный результат. Упомянутый выше термин «стратегия исполнения» относится прежде всего к способу организации параллельной работы.

В Python доступны два основных варианта — многопроцессный и многопоточный.

При использовании многопроцессной стратегии каждая функция выполняется в отдельном процессе.

В случае многопоточной стратегии функции, соответственно, запускаются в отдельных потоках.

Здесь стоит учитывать, что потоки в Python по умолчанию не являются полностью завершенными — в отличие, например, от потоков в C++.

Дело в том, что интерпретатор Python (CPython) написан на C с использованием некоторых библиотек, которые не являются потокобезопасными.

По этой причине механизм GIL (Global Interpreter Lock), используемый в CPython, не позволяет потокам выполняться по-настоящему параллельно даже на многоядерных процессорах.

Вместо этого интерпретатор постоянно переключается между потоками с интервалом примерно в 5 миллисекунд. По этой причине на современных компьютерах в большинстве случаев использование стратегии нескольких процессов будет более эффективным вариантом.

Разрабатываемая библиотека имеет следующую архитектурную особенность.

Он использует механизм Docker Swarm, который позволяет организовать единый вход и выполнить балансировку нагрузки между исполнителями.

Наличие единой точки входа для клиентов позволяет разработчикам не беспокоиться о настройке нескольких подключений и индивидуальной настройке каждого исполнителя.

Кроме того, Docker Swarm позволяет после создания контейнера реплицировать его на доступные узлы.

Он также позволяет легко увеличивать количество репликаций исполнителей, умеет балансировать нагрузку между исполнителями, автоматически перезапускает исполнителей при их отключении и автоматически подключает компьютеры, которые ранее были отключены от кластера.

Дополнительно отметим, что в представленной библиотеке возможна работа без использования Docker Swarm, так как в некоторых случаях ее использование будет избыточным.

Примером может служить ситуация, когда у нас есть ограниченное количество «слабых» машин с одноядерным процессором и ограниченным объемом оперативной памяти.

Для проверки работоспособности данной разработки были выбраны две задачи: вычисление факториала (цикл с умножением на каждой итерации) и вычисление простых чисел с помощью алгоритма «решето Ратостена».

Тестирование проводилось на двух компьютерах, подключенных к локальной сети (6 ядер на первом и 2 на втором) с общим объемом оперативной памяти 20 ГБ, под управлением ОС Linux. Были выбраны четыре вычислительные стратегии: многопроцессная, многопоточная, асинхронная и последовательная.

Стратегия многопроцессности предполагала запуск каждого экземпляра функции как отдельного процесса.

Многопоточная стратегия предполагала запуск каждой функции в отдельном потоке (с учетом механизма GIL).

Асинхронная стратегия — это стратегия цикла событий, в которой каждая функция создается как отдельная сопрограмма («сопрограмма») и опрашивается в таком цикле.

Последовательная стратегия — это стратегия запуска, при которой функции вызываются по одной.

Результаты выполнения представлены в следующей таблице.

Стратегия/Цель Факториальный расчет Вычисление простых чисел
Несколько процессов (8 процессов) 7,3525 с 39,3731 с
Многопоточный (8 потоков) 54,3255 с 42,0415 с
Последовательный 43,4656 с 41,4426 с
Асинхронный 43,5361 с 43,9102 с
На основании этих результатов можно сделать вывод, что выполнение функций в отдельных процессах позволяет максимально загрузить процессор и добиться максимальной скорости выполнения задач.

Многопоточный вариант уступает даже последовательному выполнению из-за особенностей реализации многопоточности в языке Python. Асинхронная версия показала результаты, не слишком отличающиеся от последовательной.

Но в целом это хороший индикатор для математических задач, поскольку эти функции, например, не ждут ответа от базы данных.

Также благодаря асинхронному серверу в основе каждого исполнителя вы можете запускать эти задачи вместе, не блокируя запуск других функций.

В дальнейшем развитии данной разработки планируется добавить поддержку виртуальных сред, что позволит использовать сторонние модули и фреймворки Python, а также избежать конфликтующих версий одного и того же модуля с разными функциями.

Одним из возможных применений разработки является организация распределенной проверки решений во время соревнований по программированию.

Теги: #python #docker #Распределенные системы #кластер #распределенные вычисления

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.