2012-11-22 43 views
14

我無法從R初始化到AWS EC2實例的連接,因爲我似乎不斷收到錯誤:Permission denied (publickey)我目前使用Mac OS X 10.6.8作爲我的操作系統R連接到EC2實例進行並行處理

,我嘗試在終端($),然後R(>)如下運行代碼:

$ R --vanilla 
> require(snowfall) 
> sfInit(parallel=TRUE,socketHosts =list("ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com")) 
Permission denied (publickey) 

但古怪試圖使用SSH連接實例時,我並不需要一個密碼我已經在初始化時將公鑰導入到實例中(我認爲)

所以從我的正常終端...運行

$ ssh [email protected] 

它會自動連接...(所以我不會100%地肯定如果像Using snow (and snowfall) with AWS for parallel processing in R一個密碼的問題)

我試圖尋找通過時密鑰等材料的相當數量,但似乎沒有任何差異。也是我~/.ssh/authorized_keys是一個文件夾,而不是出於某種原因的文件,並試圖sudo cd .ssh/authorized_keys時,我甚至不能訪問它......在權限方面,它具有drw-------

的最終目標是要連接到大量的EC2實例並使用foreach來執行一些並行處理...但現在連接到一個會很好...我也想使用我自己的ami,所以starcluster並不是我正在尋找的....(除非我能夠使用私有amis並私自運行所有命令......)

如果doRedis比如果有人能告訴我如何從本地機器連接到ec2實例,那也會更好。 ..

編輯

我已成功地對付使用parallelmakePSOCKcluster如圖R and makePSOCKcluter EC2 socketConnection的SSH密碼的登錄......但現在整個socketConnection問題來了,如圖中的鏈接的問題.. 。

任何想法如何連接到它?

也證明了一切工作,我想將意味着下面的命令/功能將工作在所有不同的IP地址來獲得

d <- parLapply(cl1, 1:length(cl1),function(x)system("ifconfig",intern=T)[2]) 

其中cl1make*cluster函數的輸出

注意因爲賞金是真正的問題在鏈接....我不介意哪個問題你張貼一個答案...但只要寫在這個問題上的東西,它鏈接到在關聯的問題上的正確答案,然後我無線會相應地給予積分...

+0

聽起來像你沒有給你的機器SSH權限。看看http://www.youtube.com/watch?v=YfCgK1bmCjw(00:06:43) – JohnRos

回答

8

當嘗試將主節點保持在本地時,我在並行EC2設置中也遇到了很多問題。使用StarCluster來設置池非常有幫助,但真正的改進是使用具有EC2專用IP池內的主節點的StarCluster

StarCluster設置所有節點的所有密鑰處理以及使用的所有座標。動態節點分配是不可行的,但除非長期使用現貨實例,並且您的出價策略不會「保留」您的實例,否則動態分配應該是一個問題。

其他一些經驗教訓:

  • 創建一個包含私有地址傳遞給createCluster並將其導出一個變量,所以當你需要它更容易同節點重新啓動。
  • 讓主節點運行byobu併爲R會話記錄進行設置。
  • 在主站上運行RStudio服務器有時會非常有幫助,但應該是與從屬節點不同的AMI。 :)
  • 讓控制腳本將數據rda文件卸載到遠程監視的新文件的路徑並自動下載它們。
  • 使用htop監視從站,以便您可以輕鬆查看實例並確定腳本要求(內存/ CPU /可伸縮性)。
  • 利用處理器超線程啓用/禁用腳本。

我有一個關於從連接和序列化/反序列化的問題,發現其中一件事是連接限制,並且連接限制需要減少節點的數量;當控制腳本停止時,最簡單的清理方法是重新啓動主R會話,並使用腳本殺死從屬進程而不是等待超時。

它確實需要做一些工作來設置,但希望這些想法幫助...


雖然這是8個月前兩者StarCluster和R已經改變了這裏的一些它是如何安裝。 ..您會在StarCluster文檔中找到90%。

  • 設置.starcluster/config根據AWS控制檯上的發佈信息設置AWS和密鑰對部分。
  • 定義[smallcluster]
    • 鍵名
    • 可用性區
  • 定義延伸[smallcluster]集羣模板。使用基於StarCluster 64位HVM AMI的AMI。我沒有創建新的公共AMI實例,而是保存了一個已配置的實例(以及我需要的所有工具)並將其用作AMI。

這裏有一個的一個例子...

[cluster Rnodes2] 
EXTENDS=smallcluster 
MASTER_INSTANCE_TYPE = cc1.4xlarge 
MASTER_IMAGE_ID= ami-7621f91f 
NODE_INSTANCE_TYPE = cc2.8xlarge 
NODE_IMAGE_ID= ami-7621f91f 
CLUSTER_SIZE= 8 
VOLUMES= rdata 
PLUGINS= pkginstaller 
SPOT_BID= 1.00 
  • 設置共享卷,這是其中所述屏幕/ byoubu日誌,主.R腳本檢查點輸出,共享R數據,和生產包的來源生活。它監視了一個稱爲導出的子路徑中的新文件,因此如果集羣或控制腳本死亡/放棄了最大數量的記錄,那麼所有這些記錄都將丟失並需要重新計算。

創建共享卷後,定義只是:

[volume rdata] 
VOLUME_ID = vol-1145497c 
MOUNT_PATH = /rdata 

這確保所有節點上的最新(和等於)R版本的軟件包安裝程序。

[plugin pkginstaller] 
setup_class = starcluster.plugins.pkginstaller.PackageInstaller 
packages = r-base, r-base-dev, r-recommended 

最後,對ssh和RStudio服務器的訪問權限。通過代理HTTPS會更安全,但由於RStudio只用於控制腳本設置...

[permission ssh] 
# protocol can be: tcp, udp, or icmp 
protocol = tcp 
from_port = 22 
to_port = 22 

# [permission http] 
protocol = tcp 
from_port = 8787 
to_port = 8787 

然後調試使用StarCluster界面集羣。它可以處理所有的訪問控制,系統名稱,股份等的......一旦集羣正在運行我跑的SSH會話到每個從我的本地系統,並運行一個腳本來停止超線程:

#!/bin/sh 

# disable hyperthreading 
for cpunum in $(
    cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | 
    cut -s -d, -f2- | tr ',' '\n' | sort -un); do 
     echo 0 > /sys/devices/system/cpu/cpu$cpunum/online 
done 

然後啓動每個htop會話以監視導出的檢查點日誌的可伸縮性。

然後,登錄到主設備,啓動了一個屏幕會話(我從此首選byobu),並從StarCluster安裝的卷中啓動了R。這樣,當集羣停止由於某種原因,我可以很容易地設置再次剛剛開始R.一旦在R上的第一件事就是用nodeXXX名字,只是沿着線的東西來創建一個workers.list變量:

cluster.nodes <- c("localhost", paste("node00", 1:7, sep='')) 
workers.list <- rep(cluster.nodes, 8) 

然後我加載了控制腳本,退出並保存工作區。控制腳本處理所有輸出的表輸出和檢查點以及par封裝的調用到生產包。該腳本的主要功能還採用了cpus參數,該參數是工作人員列表的放置位置,然後將其作爲cores傳遞給羣集初始值設定項。

initialize.cluster <- function(cores) 
{ 
    if(exists('cl')) stopCluster(cl) 

    print("Creating Cluster") 
    cl <- makePSOCKcluster(cores)  
    print("Cluster created.") 
    assign('cl', cl, envir=.GlobalEnv) 
    print(cl) 

    # All workers need to have the bounds generator functions... 
    clusterEvalQ(cl, require('scoreTarget')) 
    # All workers need to have the production script and package. 
    clusterExport(cl, varlist=list('RScoreTarget', 'scoreTarget')) 
    return (cl) 
} 

一旦R對話被重新啓動(後最初創建worker.list)的控制腳本被採購,稱爲主FUNC。就是這樣。通過這個設置,如果集羣停止,我只需退出主主機上的rsession;通過每個從站的htop停止從站進程並重新啓動。

下面是它在行動::

R 

R version 2.15.0 (2012-03-30) 
Copyright (C) 2012 The R Foundation for Statistical Computing 
ISBN 3-900051-07-0 
Platform: x86_64-pc-linux-gnu (64-bit) 

R is free software and comes with ABSOLUTELY NO WARRANTY. 
You are welcome to redistribute it under certain conditions. 
Type 'license()' or 'licence()' for distribution details. 

    Natural language support but running in an English locale 

R is a collaborative project with many contributors. 
Type 'contributors()' for more information and 
'citation()' on how to cite R or R packages in publications. 

Type 'demo()' for some demos, 'help()' for on-line help, or 
'help.start()' for an HTML browser interface to help. 
Type 'q()' to quit R. 

[Previously saved workspace restored] 

> source('/rdata/buildSatisfactionRangeTable.R') 
Loading required package: data.table 
data.table 1.7.7 For help type: help("data.table") 
Loading required package: parallel 
Loading required package: scoreTarget 
Loading required package: Rcpp 
> ls() 
[1] "build.satisfaction.range.table" "initialize.cluster"    
[3] "initialize.table"    "parallel.choices.threshold"  
[5] "rolled.lower"     "rolled.upper"     
[7] "RScoreTarget"     "satisfaction.range.table"  
[9] "satisfaction.search.targets" "search.range.bound.offsets"  
[11] "search.range.bounds"   "search.range.center"   
[13] "Search.Satisfaction.Range"  "update.bound.offset"   
[15] "workers.list"     
> workers.list 
    [1] "localhost" "localhost" "localhost" "localhost" "localhost" "localhost" 
    [7] "localhost" "localhost" "node001" "node002" "node003" "node004" 
[13] "node005" "node006" "node007" "node001" "node002" "node003" 
[19] "node004" "node005" "node006" "node007" "node001" "node002" 
[25] "node003" "node004" "node005" "node006" "node007" "node001" 
[31] "node002" "node003" "node004" "node005" "node006" "node007" 
[37] "node001" "node002" "node003" "node004" "node005" "node006" 
[43] "node007" "node001" "node002" "node003" "node004" "node005" 
[49] "node006" "node007" "node001" "node002" "node003" "node004" 
[55] "node005" "node006" "node007" "node001" "node002" "node003" 
[61] "node004" "node005" "node006" "node007" "node001" "node002" 
[67] "node003" "node004" "node005" "node006" "node007" "node001" 
[73] "node002" "node003" "node004" "node005" "node006" "node007" 
[79] "node001" "node002" "node003" "node004" "node005" "node006" 
[85] "node007" "node001" "node002" "node003" "node004" "node005" 
[91] "node006" "node007" "node001" "node002" "node003" "node004" 
[97] "node005" "node006" "node007" "node001" "node002" "node003" 
[103] "node004" "node005" "node006" "node007" "node001" "node002" 
[109] "node003" "node004" "node005" "node006" "node007" "node001" 
[115] "node002" "node003" "node004" "node005" "node006" "node007" 
> build.satisfaction.range.table(500000, FALSE, workers.list) 
[1] "Creating Cluster" 
[1] "Cluster created." 
socket cluster with 120 nodes on hosts ‘localhost’, ‘node001’, ‘node002’, ‘node003’, ‘node004’, ‘node005’, ‘node006’, ‘node007’ 
Parallel threshold set to: 11000 
Starting at: 2 running to: 5e+05 :: Sat Apr 14 22:21:05 2012 

如果您已經閱讀到這裏,那麼你可能有興趣知道,我測試的每個羣集設置,我可以(包括了openmpi)和示例發現沒有速度差異,也許這是因爲我的計算在哪裏如此CPU綁定,可能不是。

另外,儘管使用HPC可能會很痛苦,但請不要放棄。這可能是完全值得的。我仍然在等待完成計算的第一個100,000次迭代,如果我堅持在基於R的商品工作站上進行天真的實現(當然,並非如此,我永遠不會用R:D來堅持)。通過集羣,一週內完成了384,000次迭代。完全值得花時間(並且花了很多時間)來設置。

+0

感謝您的信息和分享您的經驗...我查看了startCluster,但是如何使用R並不明顯,其次我想使用自己的私有AMI而不是公共的。我是否應該假定您放棄使用現有的R包來滿足您的並行處理需求,而只是使用StarCluster?此外,我嘗試使用'segue' ...但它似乎需要很長時間才能建立一個EMR環境,並需要很長時間才能運行個性化套件和功能。 –

+1

「我是否應該放棄使用現有的R軟件包來滿足您的並行處理需求」 - 絕對不是! StarCluster玩的唯一部分就是設置集羣。基於StarCluster AMI生成我需要的所有東西,然後讓_it_處理掛載,關鍵設置,啓動腳本,包檢查等等,其他所有內容都是庫存R,這更容易生成我的私有AMI。我的私人包裹被放置在輸出rda監控的地方。 – Thell

+0

你有什麼機會向我展示一個如何完成的例子? –