Данные код и инструкция находятся в разработке и предназначены только для авторов и тестировщиков!
Для запуска на кластере требуется произвести несколько шагов, которые должны быть реализованы в одном скрипте.
При перезапуске Redis директории всех инстансов должны быть очищены от всех файлов, кроме конфигурационного (redis.conf
)!
-
Если Redis на кластере нет, необходимо скачать и собрать его (https://redis.io/topics/quickstart), после чего можно использовать получившиеся бинарники (необходимо добавить их в PATH). После установки самого Redis, нужно ещё скачать и собрать его низкоуровневую обертку hiredis (https://github.com/redis/hiredis).
-
После того, как команды redis-cli и redis-service стали запускаться без проблем, нужно поднять инстансы (при проблемах с настройкой инстансов и кластера можно заглянуть к сюда https://codeflex.co/configuring-redis-cluster-on-linux/). Предполагается подъём одного инстанса на нод, но никто не мешает сделать несколько, главное, чтобы это было отражено в скрипте, который запускает обработчиков bigartm (скрипт-пример на питоне
start_executors.py
считает, что Redis на нод один). Для каждого интанса стоит завести свою пустую директорию, в которую нужно положить файлredis.conf
из корня проекта. Для каждой копии нужно прописать свой валидный параметр хоста, порт можно оставить такием же (7000). -
На каждом ноде нужно из директории с конфигом вызвать команду
redis-server redis.conf &
, которая поднимет в фоновом режиме сервер. -
После того, как серверы поднялись, нужно распределить между ними слоты хэш-таблицы для ключей, которая определяет, как из подмножеств хэшей будет обрабатываться этим сервером. Поделив хэши между нодами, нужно для каждого вызвать команду
for i in {n..m}; do redis-cli -h 127.0.0.1 -p 7000 CLUSTER ADDSLOTS $i; done
,
где n и m - это границы области хэшей в диапазоне от 0 до 16383, области для разных инстансов не должны пересекаться, и все значения должны быть покрыты. В параметр -h
нужно подставить адрес хоста, на котором поднят инстанс для этого множества слотов.
- Последний шаг -- сообщить отдельным инстансам, что они являются кластером. Для этого нужно запустить команду
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
, адрес хоста нужно заменить на валидный.
В конце скрипт должен сохранить на диск файл, в котором каждая строка соответствует одному запущенному инстансу и содержит через пробел его адрес и порт.
-
Скрипт должен по аналогии с
start_executors.py
получить на вход ряд параметров, на основании которых рассчитать для каждого обработчика на каждом ноде диапазон его ответственности в словаре коллекции и множестве батчей, после чего запустить всех обработчиков в фоне с нужными параметрами. -
После запуска, скрипт должен сохранить на диск файл со списком идентификаторов запущенных обработчиков, в самом простом случае это будут последовательные числа от 0 до числа обработчиков. Файл будет передаваться на вход мастеру.
-
После запуска обработчиков скрипт должен запустить мастера (общие параметры у мастера и обработчиков должны быть одинаковыми, например, число тем или флаг продолжения обучения), который соединится с обработчиками и инициирует процесс обучения. Этот шаг не отражён в скрипте
start_executors.py
, но легко делается по аналогии с обработчиками.