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

Я запускаю разные 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: я прочитал все другие подобные вопросы, ни у одного нет воспроизводимого примера или ответа на вопрос выше.

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 фрейм данных на каждом узле, который будет уникальным для этого узла.

Другие вопросы по тегам