如何允许h2o访问所有可用内存?

8

我正在一台64 GB内存的Linux服务器上通过Rstudio Server运行h2o。当我初始化集群时,它显示总集群内存仅为9.78 GB。我尝试使用max_mem_size参数,但仍然只使用9.78 GB。

localH2O <<- h2o.init(ip =  "localhost", port = 54321, nthreads = -1, max_mem_size = "25g")
H2O is not running yet, starting it now...
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
    Connection successful!
    R is connected to the H2O cluster: 
        H2O cluster uptime:         5 hours 10 minutes 
        H2O cluster version:        3.10.4.6 
        H2O cluster version age:    19 days  
        H2O cluster name:           H2O_started_from_R_miweis_mxv543 
        H2O cluster total nodes:    1 
        H2O cluster total memory:   9.78 GB 
        H2O cluster total cores:    16 
        H2O cluster allowed cores:  16 
        H2O cluster healthy:        TRUE 
        H2O Connection ip:          localhost 
        H2O Connection port:        54321 
        H2O Connection proxy:       NA 
        H2O Internal Security:      FALSE 
        R Version:                  R version 3.3.3 (2017-03-06) 

我在服务器上运行了以下命令,以确保可用的内存数量:

cat /proc/meminfo
MemTotal:       65806476 kB

编辑:

我对这个问题进行了更深入的研究,似乎这是JVM中的默认设置。当我直接在Java中启动h2o时,我能够传递命令-Xmx32g,并且它确实增加了内存。然后我就可以连接到该h2o实例在Rstudio中,并且可以访问增加的内存。我想知道是否有一种方法可以更改JVM中的默认值,以允许更多的内存,这样我就不必先从命令行启动h2o实例,然后再从Rstudio服务器连接到它。

3个回答

5
h2o R包中的max_mem_size参数是起作用的,因此您可以使用它来启动您想要的任何大小的H2O集群--您不需要使用-Xmx从命令行启动它。
在您的情况下似乎发生的是,您正在连接到位于localhost:54321的现有H2O集群,该集群被限制为“10G”(实际上为9.78 GB)。因此,当您从R运行h2o.init()时,它将仅连接到现有的集群(具有固定的内存),而不是使用您在max_mem_size中指定的内存启动新的H2O集群,因此内存请求被忽略了。
要修复问题,请执行以下操作之一:
  • 关闭位于localhost:54321的现有H2O集群,并使用所需的内存要求从R重新启动;或者
  • 从R启动一个位于不同IP /端口的集群,而不是已经运行的那个。

谢谢!是的,看起来我没有关闭我正在使用的端口上的h2o集群。首先杀死现有的集群,然后使用max_mem_size重新初始化集群即可解决问题!感谢您的帮助!我以为因为它说“h2o尚未运行,现在开始运行...”意味着我正在启动一个新的集群,但是通过查看集群正常运行时间,我应该知道它正在连接到现有的集群。 - mikew
是的,它说“h2o尚未运行,现在开始…”这个事实对我来说也很奇怪。它不应该这样做,但它也应该打印出一堆启动消息,所以有点奇怪。不过很高兴它解决了! - Erin LeDell

3

当启动 h2o.init() 时,想要指定参数 min_mem_size=

这将强制H2O使用至少该数量的内存。 max_mem_size= 防止H2O使用超过该数量的内存。


2
如果你有6GB(例如)可用内存,你可以这样做:
library(h2o)
h2o.init(max_mem_size = "6g")

例子:更多内存


你知道如何在Sparkling Water中完成这个任务吗?我正在使用8个核心和每个执行器1GB的内存启动一个Spark会话,但它只显示1.6可用的空闲内存。 - itscarlayall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接