Ошибка при параллельной обработке: порт не может быть открыт

Я одновременно запускаю разные сценарии R в пакетном режиме в кластере Linux, чтобы оценить модель в разных наборах данных (это также происходит, когда я запускаю ее на Mac). Сценарии точно такие же, за исключением набора данных, который они используют. Когда я это делаю, я получаю следующее сообщение.

Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, : 
cannot open the connection
Calls: makePSOCKcluster -> newPSOCKnode -> socketConnection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
port 11426 cannot be opened

Вот воспроизводимый пример. Создайте два файла, tmp1.R и tmp2.R, и tmp.sh с содержимым:

Содержимое файлов tmp1.R и tmp2.R:

library(dclone)
l <- list(1:100,1:100,1:100,1:100)
cl <- makePSOCKcluster(4)
parLapply(cl, X=l, fun=function(x) {Sys.sleep(2); sum(x); })
stopCluster(cl)

Содержимое файла tmp.sh:

#!/bin/sh
R CMD BATCH tmp1.R &
R CMD BATCH tmp2.R &

Будет выполнен первый файл в списке. Второй представит ошибку выше. Кто-нибудь знает, как это решить и при этом запускать сразу все скрипты автоматически без какого-либо ручного вмешательства?

PS: я прочитал все другие подобные вопросы, ни у кого нет воспроизводимого примера или ответа на вопрос выше.


person Diogo    schedule 27.10.2016    source источник
comment
Почему вы запускаете два кластера сразу?   -  person Hong Ooi    schedule 27.10.2016
comment
Не совсем ответ... Но почему вы используете кластеры SOCK, если запускаете код на локальном хосте? В linux/mac вы можете использовать форк-кластеры (или просто mclapply).   -  person Ott Toomet    schedule 27.10.2016
comment
Для @HongOoi это просто игрушечный пример. Причина более сложная и связана с реальным применением. Что было бы альтернативой тому, чтобы сделать то же самое (т. е. автоматически запустить множество сценариев и использовать распараллеливание в каждом из них)?   -  person Diogo    schedule 27.10.2016
comment
Для @OttToomet я работаю в кластере. Не работает ни в кластере, ни на локальном хосте. Вы можете использовать вилку, и это тоже не сработает. Причина, по которой я использую SOCK, находится здесь: stat .ethz.ch/R-manual/R-devel/library/parallel/html/   -  person Diogo    schedule 27.10.2016
comment
Если вы находитесь в многоузловом кластере, я очень рекомендую использовать MPI. Либо Rmpi ​​(если не слишком много воркеров), либо скорее кластеры Rhpc.   -  person Ott Toomet    schedule 27.10.2016
comment
Не могли бы вы рассказать немного больше о кластере? В частности, есть ли у него планировщик? Вам нужны скрипты для работы? Что это значит, когда вы запускаете его на Mac?   -  person Ott Toomet    schedule 27.10.2016


Ответы (1)


Вам не нужно запускать несколько кластеров, чтобы запускать один и тот же код в нескольких наборах данных. Просто отправьте правильные данные на каждый узел.

# make 4 distinct datasets
df1 <- mtcars[1:8,]
df2 <- mtcars[9:16,]
df3 <- mtcars[17:24,]
df4 <- mtcars[25:32,]

# make the cluster
cl <- makeCluster(4)

clusterApply(cl, list(df1, df2, df3, df4), function(df) {
    # do stuff with df
    # each node will use a different subset of data
    lm(mpg ~ disp + wt, df)
})

Если вы хотите, чтобы данные были постоянными на каждом узле, чтобы вы могли использовать их для последующего анализа:

clusterApply(cl, list(df1, df2, df3, df4), function(df) {
    assign("df", df, globalenv())
    NULL
})

Это создает кадр данных df на каждом узле, который будет уникальным для этого узла.

person Hong Ooi    schedule 27.10.2016
comment
Хотя косвенно это помогает обойти проблему. Благодарность - person Diogo; 27.10.2016