在集群中部署

基本步骤

Mars 可在集群中部署。首先,你需要在集群中的每个节点运行

pip install 'pymars[distributed]'

这将会为你的集群安装所有需要的依赖。此后,你可以选择一台机器作为 Scheduler,另一台作为 Web Service,将其他的机器作为 Worker。你可以使用下面的命令启动 Scheduler:

mars-scheduler -a <scheduler_ip> -p <scheduler_port>

可以使用下面的命令启动 Web Service:

mars-web -a <web_ip> -p <web_port> -s <scheduler_ip>:<scheduler_port>

可以使用下面的命令启动 Worker:

mars-worker -a <worker_ip> -p <worker_port> -s <scheduler_ip>:<scheduler_port>

当所有 Mars 进程启动后,可启动一个 Python 命令行,执行

import mars.tensor as mt
import mars.dataframe as md
from mars.session import new_session
new_session('http://<web_ip>:<web_port>').as_default()
a = mt.ones((2000, 2000), chunk_size=200)
b = mt.inner(a, a)
b.execute()  # submit tensor to cluster
df = md.DataFrame(a).sum()
df.execute()  # submit DataFrame to cluster

你可以打开一个浏览器窗口,输入 http://<web_ip>:<web_port> 来打开 Mars UI,查看 Worker 资源使用状况和刚才提交作业的执行进度。

使用命令行

当使用命令行启动 Mars 时,你可以通过指定启动参数控制 Mars 各服务进程的行为。所有 Mars 服务均拥有下面的参数。

参数

描述

-a

对外服务地址,该地址对集群中的其他服务进程可见。当使用多穴主机及运行在虚拟机或容器中的服务时需要配置此参数

-H

服务 IP 绑定,默认为 0.0.0.0

-p

服务端口。如果缺失,将使用随机端口

-s

Scheduler Endpoint 列表,使用空格或逗号分隔。当为 Worker 或 Web 服务指定 Scheduler,或者当需要为 Scheduler 指定其他 Scheduler 时需要使用此参数

--log-level

日志级别,可以使用 debuginfowarningerror

--log-format

日志格式,可以使用 Python logging 模块的日志格式

--log-conf

Python 日志配置文件的位置,默认为 logging.conf

Scheduler 的额外参数在下面列出。

参数

描述

--nproc

服务进程数,默认为可用的核数

Worker 的额外参数在下面列出。关于内存调优的内容可以参见下一节。

参数

描述

--cpu-procs

用于计算的 CPU 进程数,默认值为可用的核数

--net-procs

用于网络传输的进程数,默认为 1

--cuda-device

CUDA 设备的序号。如果未指定,将仅使用 CPU。

--phy-mem

物理内存限制,可以为总内存大小的百分比,也可以为实际值。例如,4g80% 均为合法的值。缺失值为当前物理内存大小

--cache-mem

共享内存限制,可以为总内存大小的百分比,也可以为实际值。例如,4g80% 均为合法的值。缺失值为当前未使用内存的 50%。

--min-mem

启动 Worker 所需的最小内存,可以为总内存大小的百分比,也可以为实际值。例如,4g80% 均为合法的值。缺失值为 128m

--spill-dir

Spill 的目标路径,在 MacOS 或 Linux 下使用半角冒号(:)拆分。

--plasma-dir

Plasma Store 存储所用的路径。一旦指定,管理内存时将不会考虑 Plasma Store 的大小。

例如,如果你希望启动一个 Mars 集群,其中包含两个 Scheduler、两个 Worker 及一个 Web 服务,你可以运行下面的命令(内存和 CPU 相关的细节已被忽略)。

在 Scheduler 1(192.168.1.10)上

mars-scheduler -a 192.168.1.10 -p 7001 -s 192.168.1.10:7001,192.168.1.11:7002

在 Scheduler 2(192.168.1.11)上

mars-scheduler -a 192.168.1.11 -p 7002 -s 192.168.1.10:7001,192.168.1.11:7002

在 Worker 1(192.168.1.20)上

mars-worker -a 192.168.1.20 -p 7003 -s 192.168.1.10:7001,192.168.1.11:7002 \
    --spill-dirs /mnt/disk2/spill:/mnt/disk3/spill

在 Worker 2(192.168.1.21)上

mars-worker -a 192.168.1.21 -p 7004 -s 192.168.1.10:7001,192.168.1.11:7002 \
    --spill-dirs /mnt/disk2/spill:/mnt/disk3/spill

在 Web 服务器(192.168.1.30)上

mars-web -p 7005 -s 192.168.1.10:7001,192.168.1.11:7002

内存优化

Mars Worker 管理两个不同部分的内存,第一部分为每个进程的私有内存,第二部分是使用 Apache Arrow 中的 plasma_store 管理的共享内存。当 Mars Worker 启动,它将默认使用当前可用内存的 50% 作为共享内存,将剩余部分作为各进程私有内存使用。与此同时,Mars 为内存分配提供了软限制和硬限制,分别默认为 75% 和 90%。如果这些选项不满足你的需要,你可以使用 --cache-mem 参数配置共享内存的大小,使用 --phy-mem 参数配置总内存大小,软限制和硬限制将从这些数值计算。

例如,使用

mars-worker -a localhost -p 9012 -s localhost:9010 --cache-mem 512m --phy-mem 90%

可将共享内存限制为 512MB,总内存限制为物理内存的 90%。