当前位置: 首页 > 知识库问答 >
问题:

在多节点群集中跨H2O节点分配资源

满和安
2023-03-14

我有 2 个 docker 容器运行我的 Web 应用程序和机器学习应用程序,都使用 h2o。最初,我既调用 h2o.init() 又指向同一个 IP:PORT,因此初始化了一个具有一个节点的 h2o 集群。

考虑到我已经训练了一个模型,现在我正在训练第二个模型。在此训练过程中,如果web应用程序调用h2o集群(例如,从第一个模型请求预测),它将终止训练过程(错误消息如下),这是无意的。我尝试为每个应用程序设置不同的端口,但相同的情况不断发生。我不明白为什么,因为我认为通过设置两个不同的端口,两个不独立的集群将被初始化,因此,两个作业可以同时运行。

出错信息

Job request failed Server error java.lang.IllegalArgumentException:
      Error: Job is missing
      Request: GET /3/Jobs/$0301c0a8f00232d4ffffffff$_911222b9c2e4404c31191c0d3ffd44c6, will retry after 3s.

或者,我将 H2O 移动到其自己的容器中,并尝试设置一个多节点群集,以便每个应用在节点上运行。波纹管是用于启动群集的 dockerfile 和 entrypoint.sh 文件:

Dockerfile

########################################################################
# Dockerfile for Oracle JDK 8 on Ubuntu 16.04
########################################################################

# pull base image
FROM ubuntu:16.04

RUN \
    echo 'DPkg::Post-Invoke {"/bin/rm -f /var/cache/apt/archives/*.deb || true";};' | tee /etc/apt/apt.conf.d/no-cache && \
    echo "deb http://mirror.math.princeton.edu/pub/ubuntu xenial main universe" >> /etc/apt/sources.list && \
    apt-get update -q -y && \
    apt-get dist-upgrade -y && \
    apt-get clean && \
    rm -rf /var/cache/apt/* && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y wget unzip openjdk-8-jdk python-pip python-sklearn python-pandas python-numpy python-matplotlib software-properties-common python-software-properties && \
    apt-get clean

# Fetch h2o
ENV H2O_RELEASE rel-zipf
ENV H2O_VERSION 3.32.1.7
RUN \
    wget http://h2o-release.s3.amazonaws.com/h2o/${H2O_RELEASE}/$(echo $H2O_VERSION | cut -d "." -f4)/h2o-${H2O_VERSION}.zip -O /opt/h2o.zip && \
    unzip -d /opt /opt/h2o.zip && \
    rm /opt/h2o.zip && \
    cd /opt && \
    cd `find . -name 'h2o.jar' | sed 's/.\///;s/\/h2o.jar//g'` && \
    cp h2o.jar /opt && \
    /usr/bin/pip install `find . -name "*.whl"`

# Define the working directory
WORKDIR \
    /home/h2o

EXPOSE 54321-54326

# Define entrypoint
COPY ./bin/entrypoint.sh ./entrypoint.sh
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

入口点.sh

#!/bin/bash
# Entrypoint script.

set -e

d=`dirname $0`

# Use 90% of RAM for H2O, 30% for each node.
memTotalKb=`cat /proc/meminfo | grep MemTotal | sed 's/MemTotal:[ \t]*//' | sed 's/ kB//'`
memTotalMb=$[ $memTotalKb / 1024 ]
tmp=$[ $memTotalMb * 30 ]
xmxMb=$[ $tmp / 100 ]

# Use all 36 cores for H2O, 12 for each node.
totalCores=`lscpu | grep "^CPU(s)" | sed 's/CPU(s):[ \t]*//'`
nthreads=$[ $totalCores / 3 ]

# First try running java.
java -version

# Start 2 H2O nodes in the background
nohup java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_2_PORT} &
nohup java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_3_PORT} & 

# Start the 3rd node.
java -Xmx${xmxMb}m -jar /opt/h2o.jar -nthreads ${nthreads} -name ${H2O_CLUSTER_NAME} -port ${H2O_NODE_1_PORT}

可以看到,我总共启动了3个节点(webapp可以一次请求2个操作),每个节点都在不同的端口(端口54321、54323和54325。IP是相同的),我将每个节点的内存设置为总内存的30%,将nthread设置为可用内核的三分之一(总共36个,每个节点12个)。集群从3个节点开始很好,但是,与我预期的相反,每个节点都有所有36个内核,而不是12个(总共108个),如下面的图片所示,导致了与我之前相同的错误。

H2O 3节点集群

我查看了其他stackoverflow帖子以及H2O文档,但找不到任何适合我的东西。我如何配置H2O,以便能够从不同的应用程序同时运行多个作业?

共有1个答案

诸葛品
2023-03-14

如果您想通过具有3个独立节点的CLI启动H2O,请给它们不同的名称:

-名称H2O_CLUSTER_NAME_1

< code >-名称H2O集群名称2

< code >-名称H2O集群名称3

如果您尝试为主题指定相同的名称,它们将尝试形成一个集群。请参阅此处。

 类似资料:
  • 我需要在不同的机器上配置一个Kafka集群,但它不起作用,当我启动生产者和消费者时,将显示以下错误: 你能帮帮我吗。

  • 因为每个 Disque 节点都会将自己的配置信息储存在 disque-server 运行的文件夹里面, 而同一个文件夹只能有一份这样的配置信息, 所以如果我们打算同时运行多个节点, 那么就必须在不同的文件夹里面运行 disque-server , 并为每个节点指定不同的端口。 假设我们现在打算运行三个 Disque 节点, 那么首先要做的就是创建三个文件夹, 然后分别在这些文件夹里面运行 disq

  • 我正试图在hadoop中设置多节点集群,如何将0个数据阳极作为活动数据阳极,而我的hdfs显示了0个字节的分配 但是nodemanager后台进程正在datanodes上运行 `

  • 我在跟踪http://jayatiatblogs.blogspot.com/2011/11/storm-installation.html 我的主节点10.0.0.185。我的从节点10.0.0.79,10.0.0.124 下面是我的动物园。我的从属节点的cfg: 下面是我的Storm。我的从属节点的yaml: 下面是暴风雨。我的主节点的yaml: 我在所有从属节点中启动zookeeper,然后在

  • 我在一个集群中有两个节点;我允许用户有节点特定的配置,如日志级别,本地缓存设置等;有时,管理这些设置变得非常困难,因为用户必须知道或记住应用在特定节点上的配置--在找到该特定节点之前移动一个又一个节点;是否有任何标准或已知的方法可以从单个地方管理这些节点?比如,从httpd服务器本身还是将一个节点作为主节点并记住其他节点?

  • 如有任何帮助,不胜感激。