2017-04-20 60 views
1

如何通过R启动h2o服务器时增加h2o启动超时? 我有一个多节点AWS EC2集群,我在每个节点上启动一个单独的h2o服务器。启动后,一些EC2节点可能会有点慢,我宁愿增加超时,而不是在这些节点上重新运行h2o初始化代码。增加h2o.init超时

什么我目前做的沿

library(doParallel) 
library(foreach) 

workers=parallel::makePSOCKcluster(workerIPs,master=masterIP) 
registerDoParallel(workers) 

foreach(i=seq_along(workers),.inorder=FALSE,.multicombine=TRUE) %dopar% { 
    library(h2o) 
    h2o.init(nthreads=-1) 
    paste0(capture.output(h2o.clusterStatus()),collapse="\n") 
} 

慢节点的线条将在h2o.clusterStatus()抛出一个错误,如果h2o.init(nthreads=-1)产生超时。

顺便说一句:我使用h2o v 3.10.4.4,我在Ubuntu 16.04上。

+0

您的目标是运行几个H2O群集(每个节点上有一个)?或者多个节点上只有一个H2O集群?通常我们看到人们在做后者(如此处所述:https://github.com/h2oai/h2o-3/tree/master/ec2),所以我只是好奇。 –

+0

目前,我想每个节点有一个H2O群集。我自己实现了CV和超参数搜索算法 - 因此,每个节点的一台h2o服务器目前对我来说最适合。 – cryo111

+0

好吧,明白了。你可以在'h2o.init()'调用之前添加一个'Sys.sleep(10)',以便在启动工作节点和启动H2O集群之间花费一些时间,或者我在这里丢失了什么? –

回答

2

所以,我看着在GitHub上h2o源代码,它似乎并不仿佛有一个timeout参数(无论是在R也不在底层java代码)。有一个java参数叫做session_timeout,但我不认为这适用于我的问题。

因此,我所做的是:

foreach(i=seq_along(workers),.inorder=FALSE,.multicombine=TRUE) %dopar% { 
    library(h2o) 
    startCounter=1 
    startCounterMax=3 
    while(inherits(clusterStatus<-try({ 
     h2o.init(nthreads=-1) 
     capture.output(h2o.clusterStatus()) 
    },silent=TRUE),"try-error")&(startCounter<=startCounterMax)) { 
    startCounter=startCounter+1 
    } 
    if (startCounter>startCounterMax) stop("Failed to start h2o server for ", 
             startCounterMax," successive times") 

    return(clusterStatus) 
} 

不怎么样,但它的工作。

0

如果你想形成几个H2O节点的集群(比如用一台机器一个节点3个H2O节点群集)要等待一个指定的时间,然后你可以尝试在Java代码 - water.H2O.waitForCloudSize(3, 50 * 1000/*ms*/); 我假设在R中应该有对应的参数。

+0

我没有看到这个通过'R'界面暴露出来。 – cryo111