【问题标题】:Running parallel R on multiple hosts [closed]在多个主机上运行并行 R [关闭]
【发布时间】:2017-12-08 08:02:42
【问题描述】:

您能否提供一个脚本以在 Ubuntu Linux 机器上从头开始在 2 个主机(亚马逊 ec2)上运行并行集群?

规格

  1. 主机通过名为 amazon_key.pem 的身份密钥从本地计算机连接
  2. 主机名应该通过亚马逊云提供的内部 IP 地址连接
  3. 在设置云时将主机名保留为 rserver1 和 rserver2

【问题讨论】:

    标签: r remote-server ssh-keys doparallel rparallel


    【解决方案1】:

    所有这些命令都是从本地系统运行的。这是以这样一种方式编写的,以便人们可以根据他们的需要自动化此代码。

       HOST1=ip_of_server1
       HOST2=ip_of_server2
    

    没有pem文件的人可以避免这种情况。否则,请将 pem(key) 文件的确切位置放在本地系统中。

    pem_file_loc="~"
    

    为了找出私有IP,我的地区是eu-west-1,请替换为您的地区。已经知道私有IP的人可以忽略这一点,直接填写PIP1和PIP2

    PIP1=$(aws ec2 describe-instances --region eu-west-1 --filter "Name=ip-address,Values=${HOST1}" --query 'Reservations[].Instances[].[PrivateIpAddress]' --output text) #for finding out the private IP
    PIP2=$(aws ec2 describe-instances --region eu-west-1 --filter "Name=ip-address,Values=${HOST2}" --query 'Reservations[].Instances[].[PrivateIpAddress]' --output text) 
    

    仅为方便使用。根据您启动 ec2 实例的方式,有些人可能不需要这个。

    SSH_ARGS="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${pem_file_loc}/amazon_key.pem" 
    

    将 pem 文件复制到亚马逊机器,如果 pem 文件不存在则忽略此

    rsync -e "ssh ${SSH_ARGS}" ${pem_file_loc}/amazon_key.pem ubuntu@${HOST1}:~/
    rsync -e "ssh ${SSH_ARGS}" ${pem_file_loc}/amazon_key.pem ubuntu@${HOST2}:~/
    

    运行该命令在HOST1上设置ssh认证,没有pem文件的人可以直接登录并运行两个EOF之间的步骤。另请注意,我正在设置 rserver1 和 rserver2 以便于编码。已经拥有许多主机的人可以避免这种情况,而是将私有 IP 用于以下所有命令。

    ssh -T $SSH_ARGS ubuntu@${HOST1} <<EOF
    sudo sh -c 'echo ${PIP1} rserver1 >> /etc/hosts'
    sudo sh -c 'echo ${PIP2} rserver2 >> /etc/hosts'
    rm -rf ~/.ssh/id_rsa.pub ~/.ssh/id_rsa
    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub | ssh -i amazon_key.pem -o StrictHostKeyChecking=no ubuntu@rserver2 'cat >> ~/.ssh/authorized_keys'
    cat ~/.ssh/id_rsa.pub | ssh -i amazon_key.pem  -o StrictHostKeyChecking=no ubuntu@rserver1 'cat >> ~/.ssh/authorized_keys' #required for clustering
    EOF
    

    对 HOST2 运行相同的操作

    ssh -T $SSH_ARGS ubuntu@${HOST2} <<EOF
    sudo sh -c 'echo ${PIP1} rserver1 >> /etc/hosts'
    sudo sh -c 'echo ${PIP2} rserver2 >> /etc/hosts'
    rm -rf ~/.ssh/id_rsa.pub ~/.ssh/id_rsa
    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub | ssh -i amazon_key.pem  -o StrictHostKeyChecking=no ubuntu@rserver1 'cat >> ~/.ssh/authorized_keys'
    EOF 
    

    这些是我从博客http://www.win-vector.com/blog/2016/01/running-r-jobs-quickly-on-many-machines/ 中获取的命令。

    在 host1 的 R 服务器上运行这些命令。交叉验证您要保留的核心数量。我的案例我用作 11 。根据经验,最好保持为 detectCores() - 1

    machineAddresses <- list(
      list(host='rserver1',user='ubuntu',
           ncore=11),
      list(host='rserver2',user='ubuntu',
           ncore=11)
    )
    
    spec <- lapply(machineAddresses,
                   function(machine) {
                     rep(list(list(host=machine$host,
                                   user=machine$user)),
                         machine$ncore)
                   })
    
    spec <- unlist(spec,recursive=FALSE)
    
    library("doParallel")
    cl <- makeCluster(type='PSOCK',master=primary,spec=spec)
    registerDoParallel(cl)
    #this is purely based on your need , there are many articles on how to run parallel loops , the focus is mainly on multiple hosts
    clusterExport(cl, varlist=ls(.GlobalEnv)) 
    
    print(cl)
    ##run your commands
    stopCluster(cl)
    

    以防万一命令挂起,通过运行确认设置 system("ssh ubuntu@rserver1")system("ssh ubuntu@rserver2") 。如果 ssh 设置正确,这些命令应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 2013-04-29
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多