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