2012-11-22 44 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

你有什么机会向我展示一个如何完成的例子? –