2017-04-25 18 views
0

自動システムを使用して、makeClusterを使用して36台のCPUを搭載したマシン上の35ノードのクラスタを開くRスクリプトを起動します。 (AWS c4.8xlarge日付UbuntuとRまで実行)makeClusterは接続エラー処理戦略を開けませんか?

n.nodes = 35 
cl <- makeCluster(n.nodes, 
        outfile = "debug.txt") 

DEBUG.TXTに書き込まれるように、次のエラーは、PIDとポート番号は、セッション特有である

starting worker pid=2017 on localhost:11823 at 21:15:57.390 
    Error in socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
    cannot open the connection 
    Calls: <Anonymous> ... doTryCatch -> recvData -> makeSOCKmaster -> socketConnection 
    In addition: Warning message: 
    In socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
    localhost:11823 cannot be opened 
    Execution halted 

やや定期的に表示され。このエラーが発生すると、プログラムは続行できません。

質問1:これが起こったことを認識し、クラスタを再度作成しようとするエラー処理方法がありますか?

注:以下は

attempt=0 
while(dim(showConnections())[1] < n.nodes && attempt<=25){ # 25 chancees to create n.nodes connections 
print(attempt) 
closeAllConnections() # Close any open connections 
portnum = round(runif(1,11000,11998)) # Randomly Choose a Port 
tryCatch({ # Try to create the cluster 
    evalWithTimeout({ 
     cl <- makeCluster(n.nodes, 
        outfile = "debug.txt", 
        port=portnum) 
     },timeout = 120) # Give it two minutes and then stop trying 
     },TimeoutException = function(x) {print(paste("Failed to Create Cluster",portnum))}) # If it fails, print the portnum it tried 
     attempt=attempt+1 # Update attempt 
     Sys.sleep(2) # Take a breather 
    } 

質問2は動作しません:を自動的にクラスタを作る再試行する方法がない場合、ポートは試みる前に開くことができるかどうかを確認する方法がありますmakeClusterを実行するには?

注:このシステムは完全自動化/自己完結型でなければなりません。それは、エラーを認識し、問題を処理/修正し、手動による介入なしに処理を進める必要があります。

答えて

1

parallel::makeCluster()またはparallel::makePSOCKcluster()ここで内部的に使用される自動再試行はありません。 parallel::makePSOCKcluster()のコードを見ると、それぞれのワーカーを設定するparallel:::newPSOCKnode()に基づいて独自のバージョンを実装します。それは内部関数なので、 "ハック"とみなすべきです。

パッケージ(私は著者)には、future::makeClusterPSOCK()とコンパニオンfuture::makeNodePSOCK()があります。どちらもパブリックAPIの一部です。これは、あなた自身の改善されたバージョンを実行するビルディングブロックを提供します。また、独自の関数myCreateNode()を作成して、再試行して渡すクラスタノードをcl <- future::makeClusterPSOCK(..., makeNode = myCreateNode)として設定することもできます。申し訳ありません、それは私が今すぐに時間があります。

関連する問題