在多个主机上运行并行R

时间:2017-07-04 19:21:43

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

你能否提供一个脚本在Ubuntu Linux机器上从头开始在2台主机(amazon ec2)上运行并行集群?

规格

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

1 个答案:

答案 0 :(得分:1)

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

IO.read

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

   HOST1=ip_of_server1
   HOST2=ip_of_server2

要查找私人IP,我的区域是eu-west-1,请替换您所在的地区。已经知道私有IP的人可以忽略这一点,只需填写PIP1和PIP2

pem_file_loc="~"

仅为了便于使用。根据你如何启动你的ec2实例,有些人可能不需要这个。

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) 

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

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

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

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}:~/

为HOST2

运行相同的操作
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

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

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

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 

如果命令挂起,请通过运行确认设置 系统(&#34; ssh ubuntu @ rserver1&#34;) 系统(&#34; ssh ubuntu @ rserver2&#34;)< / em> 。如果正确设置了ssh,这些命令应该有效。