Как работает 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 для отслеживания болтовни назад и вперед.]