當嘗試將主節點保持在本地時,我在並行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次迭代。完全值得花時間(並且花了很多時間)來設置。
聽起來像你沒有給你的機器SSH權限。看看http://www.youtube.com/watch?v=YfCgK1bmCjw(00:06:43) – JohnRos