当尝试将主节点保持在本地时,我在并行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