-3

Ubuntu Linux マシンでゼロから 2 つのホスト (Amazon ec2) で並列クラスターを実行するスクリプトを提供していただけますか?

仕様

  1. ホストは、amazon_key.pem という名前の ID キーを介してローカル マシンから接続されます。
  2. ホスト名は、Amazon クラウドによって提供される内部 IP アドレスを介して接続されることになっています
  3. クラウドのセットアップ中は、ホスト名を rserver1 および rserver2 のままにします
4

1 に答える 1

2

これらのコマンドはすべてローカル システムから実行されます。これは、必要に応じてこのコードを自動化できるように書かれています。

   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 ファイルを 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}:~/

このコマンドを実行して、HOST1 で ssh 認証をセットアップします。pem ファイルを持たないユーザーは、直接ログインして 2 つの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 が適切にセットアップされていれば機能するはずです。

于 2017-07-04T19:21:43.230 に答える