R: создание кластера в doParallel / снегопад зависает

У меня есть два сервера в локальной сети со свежими установками минимальной версии Centos 6.4 и R 3.0.1. На обоих компьютерах установлены пакеты doParallel, snow и snowfall.

Серверы могут нормально подключаться друг к другу по ssh.

Когда я пытаюсь создать кластеры в любом направлении, я получаю запрос на ввод пароля, но после ввода пароля он просто зависает там на неопределенный срок.

makePSOCKcluster("192.168.1.1",user="username")

Как я могу устранить эту проблему?

редактировать:

Я также попытался вызвать makePSOCKcluster на вышеупомянутом компьютере с хостом, который можно использовать в качестве подчиненного (с других компьютеров), но он все еще зависает. Итак, возможно ли, что проблема в брандмауэре? Я также пытался использовать makePSOCKcluster с портом 22:

> makePSOCKcluster("192.168.1.1",user="username",port=22)
Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE,  :
  cannot open the connection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE,  :
  port 22 cannot be opened

вот мой iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

person dlv    schedule 29.07.2013    source источник
comment
Вы должны быть пользователем root для привязки к портам с малым количеством номеров, и вы не можете привязываться к портам, которые уже привязаны к другому процессу, такому как sshd.   -  person Steve Weston    schedule 29.07.2013


Ответы (1)


Вы можете начать с установки для параметра «outfile» пустой строки при создании объекта кластера:

makePSOCKcluster("192.168.1.1",user="username",outfile="")

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

makePSOCKcluster("192.168.1.1",user="username",outfile="",manual=TRUE)

Это обходит ssh и отображает команды, которые вы должны выполнить, чтобы вручную запустить каждого из рабочих в отдельных терминалах. Это может выявить такие проблемы, как неустановленные пакеты R. Это также позволяет вам отлаживать воркеры, используя любые инструменты отладки, которые вы выберете, хотя это требует немного работы.

Если makePSOCKcluster не отвечает после выполнения указанной команды, это означает, что рабочий процесс не смог подключиться к главному процессу. Если рабочий процесс не отображает никаких сообщений об ошибках, это может указывать на сетевую проблему, возможно, из-за того, что брандмауэр блокирует соединение. Поскольку makePSOCKcluster по умолчанию использует случайный порт в R 3.X, вы должны указать явное значение для порта и настроить брандмауэр, чтобы разрешить подключения к этому порту.

Чтобы проверить наличие проблем с сетью или брандмауэром, вы можете попробовать подключиться к главному процессу с помощью «netcat». Выполните makePSOCKcluster в ручном режиме, указав имя хоста нужного рабочего хоста и порт на локальной машине, который должен разрешать входящие соединения:

> library(parallel)
> makePSOCKcluster("node03", port=11234, manual=TRUE)
Manually start worker on node03 with
   '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=node01
PORT=11234 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 

Теперь запустите сеанс терминала на «node03» и выполните «nc», используя указанные значения «MASTER» и «PORT» в качестве аргументов:

node03$ nc node01 11234

Главный процесс должен немедленно вернуться с сообщением:

socket cluster with 1 nodes on host ‘node03’

в то время как netcat не должен отображать сообщения, так как он спокойно читает из сокетного соединения.

Однако, если netcat выводит сообщение:

nc: getaddrinfo: Name or service not known

тогда у вас проблема с разрешением имени хоста. Если вы можете найти имя хоста, которое работает с netcat, вы можете заставить makePSOCKcluster работать, указав это имя с помощью опции «master»: makePSOCKcluster("node03", master="node01", port=11234).

Если netcat немедленно возвращается, это может означать, что ему не удалось подключиться к указанному порту. Если он возвращается через минуту или две, это может означать, что ему вообще не удалось связаться с указанным хостом. В любом случае проверьте возвращаемое значение netcat, чтобы убедиться, что это ошибка:

node03$ echo $?
1

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

person Steve Weston    schedule 29.07.2013
comment
Спасибо. Я пробовал с passwordless-ssh безуспешно. При использовании makePSOCKcluster с manual=TRUE мне предлагается запустить '/usr/lib64/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=genome PORT=11494 OUT=/dev/null TIMEOUT =2592000 METHODS=TRUE XDR=TRUE что я и делаю на слейве, но после этого ничего не происходит. Добавляем больше подсказок в ОП. - person dlv; 29.07.2013
comment
Когда я отключаю свой брандмауэр (iptables) как на главном, так и на подчиненном устройствах, я получаю тот же результат, даже если manual=TRUE. - person dlv; 31.07.2013
comment
Спасибо, похоже, я куда-то попал! selinux и iptables отключены как на главном, так и на подчиненном устройствах. Я запустил «makePSOCKcluster (192.168.1.1, порт = 11234)» на ведущем устройстве, которое зависло, ПОКА я не выполнил «nc 192.168.1.2 11234» на ведомом устройстве. Сразу после вызова nc на подчиненном устройстве в кластере главных сокетов с 1 узлами на хосте '192.168.1.1' появляется следующее. (192.168.1.2 — главный, 1.1 — подчиненный). Итак, означает ли это, что ведомое устройство не прослушивает порт, пока ему не прикажут? Как я могу запускать кластеры сокетов без использования nc на подчиненном устройстве? Спасибо еще раз. - person dlv; 09.08.2013
comment
@user1489048 user1489048 К сожалению, на самом деле рабочий процесс не запустился: вы обманули мастера, заставив его думать, что он запустился, когда вы подключились к нему с помощью nc. Вопрос: отображает ли мастер MASTER=192.168.1.2 при использовании ручного режима? Если нет, может помочь установка master=192.168.1.2. - person Steve Weston; 09.08.2013
comment
@ user1489048 Другими словами, попробуйте запустить makePSOCKcluster (192.168.1.1, master = 192.168.1.2, port = 11234)». - person Steve Weston; 09.08.2013
comment
определение мастера как IP, а не имени хоста сработало. Большое спасибо! - person dlv; 09.08.2013
comment
У меня сработало форсирование порта (11000) и открытие ITOps на обоих серверах. Спасибо - person Oli; 29.09.2016