Запуск параллельного R на нескольких хостах

Не могли бы вы предоставить скрипт для запуска параллельного кластера на 2 хостах ( amazon ec2) с нуля на Ubuntu Linux Machine?

Характеристики

  1. Хосты подключены с локального компьютера через идентификационный ключ amazon_key.pem
  2. имена хостов должны быть подключены через внутренний IP-адрес, предоставленный облаком Amazon
  3. оставьте имена хостов как rserver1 и rserver2 при настройке облака

1 ответ

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

   HOST1=ip_of_server1
   HOST2=ip_of_server2

Люди, у которых нет файла pem, могут избежать этого. В противном случае укажите точное местоположение файла pem(ключа) в вашей локальной системе.

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 на машину amazon, если файл 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}:~/

Выполните эту команду, чтобы настроить ssh-аутентификацию на HOST1, люди без файла 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/.

Запустите эти команды на R-сервере host1. Перепроверьте количество ядер, которое вы хотите сохранить. Мой случай я использовал как 11 . Эмпирически это хорошо, чтобы сохранить, как Detecores() - 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 настроен правильно.

Другие вопросы по тегам