R y makePSOCKcluter EC2 socketConnection

Me gustaría poder conectar mi Mac a mis instancias de EC2 para realizar el procesamiento paralelo en AWS a través deparallel paquete usandomakePSOCKcluster omakeSOCKCluster.

En el momento en que mi intento deja a R 'colgando', entonces he adaptadomakePSOCKcluster, y algunas de sus sub-rutinas tales que algunos de sus resultados pueden verse agregando un-v Opción a la ssh. Creo que he logrado lidiar con el inicio de sesión ssh sin contraseña, pero me estoy atascando en elsocketConnection Parte que creo que está causando problemas.

He intentado asociar los Elastic IPs y usarlos como direcciones IP en vano, también he intentado ajustar los grupos de seguridad para que incluyan el puerto predeterminado que makePSOCKcluster utiliza en vano ... En este último caso, no utilicé el argumento de los puertos y usó la opción de puerto predeterminada de 10187 a la que dice:

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 10187 cannot be opened

Mirando algunas preguntas de la lista de correo de HPC, este parece ser un problema relacionado con ser Windows ... pero dado que me estoy conectando desde una Mac, no creo que caiga en esta categoría.

loshosts objeto es solo el DNS público que se proporciona después de lanzar una instancia de EC2.

El siguiente es mi intento actual habiendo adaptado algunas de lasmakePSOCKcluster función paramakePSOCKcluster1 deberían ser más o menos iguales.

He especificado elrscript parámetro para coincidir con lo que se esperaría en una instancia de Ubuntu, y he especificado elubuntu como el nombre de usuario para iniciar sesión como en la instancia de ubuntu EC2.

makePSOCKcluster1 <- function (names, ...) {
    if (is.numeric(names)) 
        names <- rep("localhost", names[1])
    options <- parallel:::addClusterOptions(parallel:::defaultClusterOptions, list(...))
    cl <- vector("list", length(names))
    for (i in seq_along(cl)) cl[[i]] <- newPSOCKnode1(names[[i]], 
        options = options, rank = i)
    class(cl) <- c("SOCKcluster", "cluster")
    cl
}



newPSOCKnode1 <- function (machine = "localhost", ..., options = parallel:::defaultClusterOptions, 
                           rank) 
{
    options <- options
    if (is.list(machine)) {
        options <- options
        machine <- machine$host
    }
    outfile <- parallel:::getClusterOption("outfile", options)
    master <- if (machine == "localhost") 
        "localhost"
    else parallel:::getClusterOption("master", options)
    port <- parallel:::getClusterOption("port", options)
    manual <- parallel:::getClusterOption("manual", options)
    timeout <- parallel:::getClusterOption("timeout", options)
    methods <- parallel:::getClusterOption("methods", options)
    useXDR <- parallel:::getClusterOption("useXDR", options)
    env <- paste("MASTER=", master, " PORT=", port, " OUT=", 
                 outfile, " TIMEOUT=", timeout, " METHODS=", methods, 
                 " XDR=", useXDR, sep = "")
    arg <- "parallel:::.slaveRSOCK()"
    rscript <- if (parallel:::getClusterOption("homogeneous", options)) {
        shQuote(parallel:::getClusterOption("rscript", options))
    }
    else "Rscript"
    cmd <- paste(rscript, "-e", shQuote(arg), env)
    renice <- parallel:::getClusterOption("renice", options)
    if (!is.na(renice) && renice) 
        cmd <- sprintf("nice +%d %s", as.integer(renice), cmd)
    if (manual) {
        cat("Manually start worker on", machine, "with\n    ", 
            cmd, "\n")
        flush.console()
    }
    else {
        if (machine != "localhost") {
            rshcmd <- parallel:::getClusterOption("rshcmd", options)
            user <- parallel:::getClusterOption("user", options)
            cmd <- shQuote(cmd)
            cmd <- paste(rshcmd, "-v -l", user, machine, cmd)
            print(cmd)
        }
        if (.Platform$OS.type == "windows") {
            system(cmd, wait = FALSE, input = "")
        }
        else system(cmd, wait = FALSE)
    }
    print("ssh done!!! about to start socketConnection....")
    con <- socketConnection("localhost", port = port, server = TRUE, 
                            blocking = TRUE, open = "a+b", timeout = timeout)
    print("socketConnection complete!!!")
    structure(list(con = con, host = machine, rank = rank), class = if (useXDR) 
        "SOCKnode"
              else "SOCK0node")
}



 hosts <- c("ec2-xxx-xx-xxx-xxxx.zone.compute.amazonaws.com","ec2-xx-xxx-xxx-xxx.zone.compute.amazonaws.com")
 # the code to try and connect to the actual EC2 instance...
 cl1 <- makePSOCKcluster1(hosts, user="ubuntu", rscript="/usr/lib/R/bin/Rscript", port=8787)



[1] "ssh -v -l ubuntu ec2-xxxxxxxxxxx.zone.compute.amazonaws.com \"'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=local.machine.name PORT=8787 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE\""
[1] "ssh done!!! about to start socketConnection...."
OpenSSH_5.2p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to ec2-xxxxxxxxxxx.zone.compute.amazonaws.com [xx.xxx.xx.x.x] port 22.
debug1: Connection established.
debug1: identity file /Users/username/.ssh/identity type -1
debug1: identity file /Users/username/.ssh/id_rsa type 1
debug1: identity file /Users/username/.ssh/id_dsa type 2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debian-5ubuntu1
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.2
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
Warning: Permanently added 'ec2-xx-xx-xxx-xxx-xx.ap-southeast-1.compute.amazonaws.com,xx.xxx.xxx.xx.x' (RSA) to the list of known hosts.
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /Users/username/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending command: '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=local.machine.name PORT=8787 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
debug1: fd 2 clearing O_NONBLOCK
Transferred: sent 2352, received 2400 bytes, in 20.0 seconds
Bytes per second: sent 117.5, received 119.9
debug1: Exit status 1

Estoy usando una Mac en OS X 10.6.8 para conectarme a una instancia de Debian Ubunutu. Si hubiera mejores formas de conectarse a las instancias de EC2 para realizar un procesamiento paralelo que la gente sepa, también sería extremadamente útil.

El objetivo final es utilizarforeach para realizar este procesamiento una vez registrado el cluster.

También como una pregunta complementaria, me preguntaba, ¿cuáles son los pros y los contras de velocidad / procesamiento asociados con la realización de un proceso en paralelo frente al uso de MPI? ¿O algún otro método?

¡Gracias por adelantado!

EDITAR Me las he arreglado para conseguir elmakePSOCKcluster para trabajar si se inicia desde una instancia EC2 separada, y laparLapply La función funciona, e incluso puedo registrarme usandoregisterDoParallel(cl1) dóndecl1 es el objeto cluster, pero por alguna razónforeach...%dopar% no funciona ... dando el error:

Error in serialize(data, node$con) : error writing to connection

o

Error in unserialize(node$con) : error reading from connection

Las conexiones parecen estar bien cuando se mirashowConnections() Con esto como la siguiente salida:

> showConnections()
  description                                                 class      mode  text     isopen   can read can write
3 "<-ip-xx-xxxx-x-xxx.zone.compute.internal:10187"   "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
4 "<-ip-yy-yyyy-y-yyyy.zone.compute.internal:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
5 "<-ip-zz-zzzz-z-zzzz.zone.compute.internal:10187"  "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
> 

dóndex,y & z representan las diferentes direcciones ip ....foreach Los ejemplos salen directamente de los ejemplos dados en los archivos de ayuda deforeach y además algunas de lasclusterCall/clusterExport/clusterEvalQ funciones de laparallel el paquete tampoco funciona ... dando un mensaje de error similar al anterior ...

Todavía me gustaría poder conectarme desde una Mac ... pero también me gustaría poder usar foreach para realizar un procesamiento paralelo ... espero que la información adicional ayude

Respuestas a la pregunta(0)

Su respuesta a la pregunta