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