Как работает doRedis? - PullRequest
       33

Как работает doRedis?

15 голосов
/ 23 апреля 2011

Я играл с R интерфейсом к базе данных redis , а также с doRedis параллельным бэкэндом для foreach .У меня есть пара вопросов, чтобы помочь мне лучше применить этот инструмент:

  1. doMC, doSMP, doSnow и т. Д. Все, кажется, работают, вызывая рабочие процессы на одном компьютере, передавая им элементиз списка и функции для применения, а затем сбор результатов.В случае с doMC рабочие делятся памятью.Однако меня немного смущает вопрос о том, как база данных может обеспечивать такую ​​же функциональность.
  2. Когда я добавляю дополнительный подчиненный компьютер в очередь заданий doRedis (, как в этом видео ), вся база данных doredis отправляется на подчиненный компьютер?Или каждый ведомый - это только данные, которые ему нужны в определенный момент (т. Е. Один элемент списка и применяемая функция).
  3. Как явно передать дополнительные данные и функции в очередь заданий doRedis, чтобы каждыйведомому нужно будет выполнять свои вычисления?
  4. При использовании doRedis и foreach, существуют ли какие-либо дополнительные «ошибки», которые могут не применяться к другим параллельным бэкэндам?

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

Спасибовы!

1 Ответ

15 голосов
/ 24 апреля 2011

Одна часть головоломки: 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: Get ).Вы передаете выражение с разделителями на стороне foreach, которое задается строковым ключом в redis , к которому у рабочих есть доступ.

4 - я не знаю (но это вряд ли авторитетно)так что спросите вокруг.) Я также предлагаю вам прочитать предоставленный исходный код.Ответы выше прямо из чтения doRedis.R и redisWorker.R.

Надеюсь, это поможет.

[ps telnet для вашего redis и введите команду Redis: monitor следить за болтовней взад и вперед.]

...