通过未来包中的R中的集群作业管理

时间:2017-08-24 18:08:38

标签: r parallel-processing future

我想使用Rfuture(支持异步计算)来创建一个可以在队列中动态添加/删除作业的集群作业服务器。

我想要添加到我的作业服务器的一个特定功能是将需要内存的作业分配给集群中功能更强大的计算机。但是,由于我没有使用该软件包的经验,我不太确定我的方法(如下所示)是否存在任何缺陷。具体来说,plan的后续调用是否会产生任何可能导致问题混乱的副作用?有关更多详细信息,请参阅代码中的注释。

提前致谢!

library(parallel)
library(future)

slaveIPs=c("172.16.2.10","172.16.2.21")
masterIP="172.16.2.33"
workers=makePSOCKcluster(slaveIPs,master=masterIP)

#check whether PSOCK cluster was correctly set up
unlist(clusterCall(workers,function(x) unname(Sys.info()["nodename"]))
#[1] "ip-172-16-2-10" "ip-172-16-2-21"

#now the first important part that I am not sure about
#as you can see, I only use workers[1] for the first task
#is it OK to use workers[1] like that?
plan(cluster,workers=workers[1])

f=future({
  #do memory-hungry work
  unname(Sys.info()["nodename"])
})

message(value(f))
#ip-172-16-2-10

#now I am only using workers[2] for the second task
#Is this ok? Does the previous call to 'plan' need some cleaning before?
plan(cluster,workers=workers[2])

f=future({
  #do low-memory work
  unname(Sys.info()["nodename"])
})

message(value(f))
#ip-172-16-2-21

stopCluster(workers)

1 个答案:

答案 0 :(得分:1)

future的作者:

是的,可以改变未来的策略,即使用f <- cluster({ #do low-memory work unname(Sys.info()["nodename"]) }, workers = workers[2]) 。另一种方法是使用:

cluster

这基本上是内部发生的事情。

明确指定此类未来策略的缺点是您的代码将被硬编码为使用f <- future({ ... }, needs = "himem") 期货。

仅供参考,我计划在未来添加某种机制来指定首选或必需的“资源”。这只是现在的概念,不会很快存在,但我正在考虑符合以下内容:

himem

可以向员工查询attr(workers[2], "provides") <- c("himem", "superfast")代码/属性,例如slaveIPs=c("172.16.2.10","172.16.2.21") masterIP="172.16.2.33" workers=makePSOCKcluster(slaveIPs,master=masterIP) 。我正在分享这些想法,所以你知道我知道像你这样的需求。同样,在此类机制可用之前还需要一段时间,因此同时,您需要明确指定未来战略。

BTW,而不是:

slaveIPs <- c("172.16.2.10", "172.16.2.21")
workers <- makeClusterPSOCK(slaveIPs)

你可以尝试:

future

由{{1}}包提供 - 这可以避免必须知道/指定主服务器的IP地址。