Как работает doRedis?
Я поиграл с интерфейсом R к базе данных redis, а также с параллельным бэкэндом doRedis для foreach. У меня есть пара вопросов, чтобы помочь мне лучше применить этот инструмент:
- Кажется, что doMC, doSMP, doSnow и т. д. работают, вызывая рабочие процессы на одном компьютере, передавая им элемент из списка и применяемую функцию, а затем собирая результаты. В случае с doMC рабочие делятся памятью. Тем не менее, я немного сбит с толку относительно того, как база данных может обеспечить такую же функциональность.
- Когда я добавляю дополнительный подчиненный компьютер в очередь заданий doRedis ( как в этом видео), отправляется ли вся база данных doredis на подчиненный компьютер? Или каждый ведомый - это просто данные, которые ему нужны в определенный момент (т. Е. Один элемент списка и функция, которую нужно применить).
- Как явным образом передать дополнительные данные и функции в очередь заданий doRedis, которые будут необходимы каждому ведомому для выполнения своих вычислений?
- При использовании doRedis и foreach, есть ли дополнительные "ошибки", которые могут не применяться к другим параллельным бэкэндам?
Я знаю, что это много вопросов, но я сталкивался с ситуациями, когда мое ограниченное понимание того, как работает параллельная обработка, препятствовало моим способностям реализовать ее. Например, недавно я попытался распараллелить вычисления в большой базе данных и поймал себя на том, что передал всю базу данных каждому узлу в моем кластере, что полностью разрушило все преимущества, которые я получил от распараллеливания.
Спасибо!
1 ответ
Один кусок головоломки - Рредис
1 - doRedis использует rredis. В частности, doRedis.R использует redis: RPush (поскольку он выполняет итерации по элементам foreach), и каждый redisWorker использует redis:BRPop для получения чего-либо из списка redis (который вы назвали в своей работе doRedis "job").
Redis - это не просто база данных. Здесь это используется в качестве очереди!
2 - У вас есть 1 экземпляр (удаленно), доступный для всех ваших сотрудников R. Думайте о сервере Redis как о распределенной очереди. Ваш мастер работы помещает элементы в список, а рабочие берут и обрабатывают элемент, обрабатывают его и помещают в список результатов. Вы можете иметь m рабочих для N предметов. Зависит от того, что вы хотите сделать.
3 - Используйте env param. При этом используется Redis: набор, к которому имеют доступ все работники (через Redis: Get). Вы передаете выражение с разделителями на стороне foreach, которое устанавливается в ключе строки в redis, к которому у рабочих есть доступ.
4 - Ничего из того, что я знаю (но вряд ли это авторитетно, так что спрашивайте). Я также предлагаю вам прочитать предоставленный исходный код. Ответы выше прямо из чтения doRedis.R
а также redisWorker.R
,
Надеюсь это поможет.
[ps telnet к вашему redis и введите команду Redis:monitor для отслеживания болтовни вперед и назад.]