R连接到EC2实例进行并行处理

我无法初始化从R的AWS EC2实例的连接,因为我似乎不断收到错误: Permission denied (publickey)我目前使用Mac OS X 10.6.8作为我的操作系统

我尝试在终端($)和R(>)中运行的代码如下所示:

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

但奇怪的是,当试图ssh进入实例时,我不需要密码,因为我已经在初始化时将公钥导入到实例中了(我认为)

所以从我的正常终端...跑步时

$ ssh ubuntu@ec2-xx-xxx-xx-xx.zone.compute.amazonaws.com

它会自动连接...(所以我不能100%确定它是否是一个无密码问题,比如在R中使用snow(和snowfall)和AWS进行并行处理)

我已经尝试通过相当数量的钥匙等资料来查看,但似乎没有任何区别。 另外我的~/.ssh/authorized_keys是一个文件夹,而不是一个文件出于某种原因,我甚至在尝试使用sudo cd .ssh/authorized_keys时无法访问它......根据权限它drw-------

最终目标是连接到很多ec2实例,并使用foreach进行一些并行处理......但现在连接到一个会很好......我也想用我自己的ami,这样starcluster不是'真的,我在找什么....(除非我能够使用私人amis并私下运行所有​​命令......)

同样,如果doRedis比如果有人能告诉我如何从本地机器连接到ec2实例那样更好,doRedis会更好......

编辑

我设法使用parallel软件包makePSOCKcluster来处理ssh无密码登录,如R和makePSOCKcluter EC2 socketConnection所示...但现在遇到socketConnection问题,如链接问题所示...

任何想法如何连接到它?

也证明一切正常,我想这意味着下面的命令/函数将工作得到所有不同的IP地址

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

其中cl1make*cluster函数的输出

注意,因为赏金真的是链接中的问题....我不介意你提出答案的问题......但只要在这个问题上写了一些东西,将它链接到正确答案在相关问题上,我会相应地给予奖励......


尝试将主节点保持在本地时,我也在并行EC2设置中遇到了很多问题。 使用StarCluster来设置池有很大的帮助,但真正的改进来自于使用StarCluster并在EC2私有IP池中拥有主节点。

StarCluster设置所有节点的所有密钥处理以及使用的所有坐标。 动态节点分配是不可行的,但除非长期使用现货实例,并且您的出价策略不会“保留”您的实例,否则动态分配应该是一个问题。

其他一些经验教训:

  • 创建一个包含专用IP的变量,将其传递给createCluster并将其导出,因此,当需要使用相同节点重新启动时,它更容易。
  • 让主节点运行byobu并为R会话记录进行设置。
  • 在主设备上运行RStudio服务器有时会非常有用,但应该是与从属节点不同的AMI。 :)
  • 让控制脚本将数据rda文件卸载到远程监视新文件的路径上并自动下载它们。
  • 使用htop监视从站,以便您可以轻松查看实例并确定脚本要求(内存/ CPU /可伸缩性)。
  • 利用处理器超线程启用/禁用脚本。
  • 我在从属连接和序列化/反序列化方面遇到了一些问题,并发现其中一个问题是连接限制,并且连接限制需要通过节点数来减少; 当控制脚本停止时,最简单的清理方法是重新启动主R会话,并使用脚本杀死从属进程而不是等待超时。

    它确实需要一些工作来设置,但希望这些想法可以帮助...


    虽然是8个月前,StarCluster和R都改变了它的一些设置......你会在StarCluster文档中找到90%的这个。

  • 根据AWS控制台中的发布信息设置.starcluster / config 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变量,这只是沿着以下nodeXXX行的内容:

    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次迭代。 完全值得花时间(并且花了很多时间)来设置。

    链接地址: http://www.djcxy.com/p/53421.html

    上一篇: R connecting to EC2 instance for parallel processing

    下一篇: Using AWS for parallel processing with R