增加 h2o.init 超时

Increase h2o.init timeout

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

我目前正在做的是

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.init(nthreads=-1) 产生超时,慢速节点将在 h2o.clusterStatus() 处抛出错误。

顺便说一句:我正在使用 h2o v 3.10.4.4 并且我在 ubuntu 16.04.

所以,我查看了 github 上的 h2o 源代码,似乎没有 timeout 参数(R 和底层 java 代码)。有一个名为 session_timeoutjava 论点,但我认为这不适用于我的问题。

所以我所做的是:

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)
}

不是很好,但也够用了。

如果你试图形成一个由多个 H2O 节点组成的集群(比如 3 个 h2o 节点的集群,每台机器一个节点)并且你想等待指定的时间,那么你可以在 Java 中尝试代码 - water.H2O.waitForCloudSize(3, 50 * 1000/*ms*/); 我假设 R 中也应该有相应的参数。