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

Distribute resources accross H2O nodes in a multi-node cluster

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

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

错误信息

Job request failed Server error java.lang.IllegalArgumentException:
      Error: Job is missing
      Request: GET /3/Jobs/01c0a8f00232d4ffffffff$_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"]

entrypoint.sh

#!/bin/bash
# Entrypoint script.

set -e

d=`dirname [=12=]`

# 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%,并将 nthreads 设置为可用内核的三分之一(总共 36 个,每个节点 12 个)。集群开始时有 3 个节点,但与我的预期相反,每个节点都有 36 个核心而不是 12 个(总共 108 个),如下图所示,导致与我之前遇到的错误相同。

H2O 3-node cluster

我查看了其他 Whosebug post 以及 H2O 文档,但找不到适合我的内容。如何配置 H2O 以便我可以从不同的应用程序同时处理多个作业 运行ning?

如果你想用 3 个独立的节点通过 CLI 启动 H2O,然后给它们不同的名字:

-name H2O_CLUSTER_NAME_1

-name H2O_CLUSTER_NAME_2

-name H2O_CLUSTER_NAME_3

如果你尝试给主题起相同的名字,它们会尝试形成一个集群。参见 here