2017-01-13 3 views
1

로컬 호스트에서 완벽하게 작동하는 R을 병렬로 실행하려고합니다. 이제는 다중 노드 설정으로 전환하고 동일한 네트워크에서 여러 가상 시스템을 만들려고합니다.R이 "연결을 열 수 없습니다"오류로 인해 클러스터 (멀티 노드)를 만들 수 없습니다.

Error in socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
cannot open the connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> makeSOCKmaster -> 
socketConnection 
In addition: Warning message: 
In socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
ubuntu-r-node1:11056 cannot be opened 

최소 재현 예 :

library("parallel") 
cl <- makeCluster(c(rep("192.168.42.26",2),rep("192.168.42.32",2)),outfile = "") 

나는 또한 단지 localhost를 그 위에 소켓을 열어 봤어 내가 클러스터를 설정하기 위해 노력하고있어 그러나, 다음과 같은 오류와 함께 실패 같은 오류 메시지와 함께뿐만 아니라 실패 (그러나 로컬 호스트 클러스터에만 작동) :

socketConnection("localhost", port = 11056, blocking = TRUE, open = "a+b") 

을 내가 추가 할 경우에만 서버 = TRUE 옵션을 사용하면 socketConnection이 작동하지만이 옵션이 makeCluster 및 해당 설정 방법에 적합한 지 잘 모르겠습니다.

우분투 서버 16.04를 새로 설치하고 iptables 규칙이 비어 있습니다 (모두 허용). ssh가 양방향으로 작동하기 때문에 작동하지 않는 이유를 알 수 없습니다.

답변

1

작업자가 마스터 프로세스에 연결을 시도 할 때 오류가 발생합니다. 작업자 중 적어도 하나가 예제에서 "ubuntu-r-node1"인 마스터의 호스트 이름을 확인할 수 없기 때문일 수 있습니다. 마스터의 호스트 이름은 기본적으로 Sys.info()['nodename']을 사용하여 결정되며 작업자 중 누구도이 이름을 확인할 수 없으면 마스터에 대한 소켓 연결을 만들 수 없으며 makeCluster이 중단됩니다.

이 문제의 일반적인 해결 방법은 makeCluster "master"옵션을 사용하여 마스터가 실행중인 컴퓨터의 IP 주소를 지정하는 것입니다.

cl <- makePSOCKcluster(c(rep('192.168.42.26', 2), 
         rep('192.168.42.32', 2)), 
      master=nsl(Sys.info()['nodename']), 
      outfile='') 

노동자와 마스터 모두 IP 주소를 지정하면 다음과 같습니다 (Windows에서 사용할 수 없습니다)을 nsl 기능을 사용하면 오히려 노동자보다 마스터 마스터의 호스트 이름을 찾아 볼 수있는 것을 할 수있는 방법이다 DNS 문제에 대한 문제가 훨씬 적습니다. 이 예에서 마스터는 '192.168.42.26'및 '192.168.42.32'로 ssh'ing하여 작업자를 시작하고 작업자는 socketConnection을 사용하여 nsl(Sys.info()['nodename'])에 의해 반환 된 값으로 마스터에 다시 연결합니다.

makeCluster "port"옵션은 포트가 11000에서 11999 범위에서 무작위로 선택되기 때문에 마스터에 방화벽이있는 경우 중요 할 수 있습니다.

0

DNS는 양방향으로 작동해야합니다.

예, 내 예제에서 첫 번째 호스트 (192.168.42.26)는 이름이 'host1의'다음 두 번째 호스트 (192.168.42.32) '호스트 2'를했을 경우 모두

ssh host1 

(호스트 2에서)

과 (host1의에서)

ssh host2 

R 클러스터를 실행 작동합니다.

1

다음의 대안으로, 여기에 포함 된 방화벽에 문제가있는 경우 : 사용을 시도 할 수

cl <- makePSOCKcluster(workers, outfile = "") 

:

library("future") 
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "", verbose = TRUE) 

library("parallel") 
workers <- c(rep("192.168.42.26",2), rep("192.168.42.32",2)) 
cl <- makeCluster(workers, outfile = "") 

에 해당되는

후자는 나가는 SSH 연결의 "내부"부분 인 소위 역 SSH 터널을 설정합니다 마스터에서 노동자로. 예를 들어 포트 범위가 차단되어 있기 때문에 방화벽이 작업자가 parallel::makePSOCKcluster() 마스터에 다시 연결하지 못하게하면 future::makeClusterPSOCK(..., revtunnel = TRUE)이 문제를 해결합니다. verbose=TRUE 출력과 같이 표시해야합니다 :이게 무슨 표시하는 것은

Starting worker #1 on '192.168.42.26': 'ssh' -R 11356:localhost:11356 192.168.42.26 "'Rscript' --default-packages=datasets,utils,grDevices,graphics,stats,methods -e 'parallel:::.slaveRSOCK()' MASTER=localhost PORT=11356 OUT= TIMEOUT=2592000 XDR=TRUE" 
Waiting for worker #1 on '192.168.42.26' to connect back 
Connection with worker #1 on '192.168.42.26' established 
[...] 

을, 지금까지의 192.168.42.26가 알고있는이 노동자로, 그것은 다시는 같은 기계 (MASTER=localhost:11356)에서 실행 생각하는 마스터 프로세스에 연결하고, 그 어떤 역 SSH 터널 (-R 11356:localhost:11356)이 해당 시스템의 포트를 SSH 연결을 통해 다시 마스터에 매핑하기 때문에 발생합니다.

이 역 터널링 방법은 당신을 위해 작동하지 않는 경우

, 난 당신이 포트 등

나는이 말이 희망을 차단하는 것에 더 자세한 내용은 SYSADM에게 물어 생각합니다.

+1

답변 해 주셔서 감사합니다. 문제는 이미 해결되었지만 (DNS 문제 였고 별도의 답변으로 게시했습니다) 제공 한 정보는 실제로 매우 유용합니다. revtunnel 옵션에 대해 알지 못했습니다. –

관련 문제