/cluster-bigartm

Primary LanguageC++BSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

Кластерная версия bigartm на базе Redis

Данные код и инструкция находятся в разработке и предназначены только для авторов и тестировщиков!

Для запуска на кластере требуется произвести несколько шагов, которые должны быть реализованы в одном скрипте.

Часть 1: старт Redis

При перезапуске Redis директории всех инстансов должны быть очищены от всех файлов, кроме конфигурационного (redis.conf)!

  1. Если Redis на кластере нет, необходимо скачать и собрать его (https://redis.io/topics/quickstart), после чего можно использовать получившиеся бинарники (необходимо добавить их в PATH). После установки самого Redis, нужно ещё скачать и собрать его низкоуровневую обертку hiredis (https://github.com/redis/hiredis).

  2. После того, как команды redis-cli и redis-service стали запускаться без проблем, нужно поднять инстансы (при проблемах с настройкой инстансов и кластера можно заглянуть к сюда https://codeflex.co/configuring-redis-cluster-on-linux/). Предполагается подъём одного инстанса на нод, но никто не мешает сделать несколько, главное, чтобы это было отражено в скрипте, который запускает обработчиков bigartm (скрипт-пример на питоне start_executors.py считает, что Redis на нод один). Для каждого интанса стоит завести свою пустую директорию, в которую нужно положить файл redis.conf из корня проекта. Для каждой копии нужно прописать свой валидный параметр хоста, порт можно оставить такием же (7000).

  3. На каждом ноде нужно из директории с конфигом вызвать команду redis-server redis.conf &, которая поднимет в фоновом режиме сервер.

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

for i in {n..m}; do redis-cli -h 127.0.0.1 -p 7000 CLUSTER ADDSLOTS $i; done,

где n и m - это границы области хэшей в диапазоне от 0 до 16383, области для разных инстансов не должны пересекаться, и все значения должны быть покрыты. В параметр -h нужно подставить адрес хоста, на котором поднят инстанс для этого множества слотов.

  1. Последний шаг -- сообщить отдельным инстансам, что они являются кластером. Для этого нужно запустить команду

redis-cli -h 127.0.0.1 -p 7000 CLUSTER MEET 127.0.0.2 7000,

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

Для проверки состояния кластера надо запустить redis-cli -h 127.0.0.1 -p 7000 CLUSTER NODES, адрес хоста нужно заменить на валидный.

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

Часть 2: запуск bigartm

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

  2. После запуска, скрипт должен сохранить на диск файл со списком идентификаторов запущенных обработчиков, в самом простом случае это будут последовательные числа от 0 до числа обработчиков. Файл будет передаваться на вход мастеру.

  3. После запуска обработчиков скрипт должен запустить мастера (общие параметры у мастера и обработчиков должны быть одинаковыми, например, число тем или флаг продолжения обучения), который соединится с обработчиками и инициирует процесс обучения. Этот шаг не отражён в скрипте start_executors.py, но легко делается по аналогии с обработчиками.