首页 > 解决方案 > Dask 如何在云中的多个 vm 上执行代码

问题描述

我用 dask 和延迟写了一个程序,现在我想在云中的几台机器上运行它。但是有一件事我不明白 - dask 如何在云中的多台机器上运行代码而没有代码的所有依赖项?

标签: pandasdaskdask-distributeddask-delayeddask-kubernetes

解决方案


在多台机器上运行时,Dask 工作人员必须有权访问所有必需的依赖项才能运行您的代码。

你已经标记了你的问题,dask-kubernetes所以我会用它作为例子。默认情况下dask-kubernetes,使用daskdev/daskDocker 映像来运行您的工作人员。此映像包含 Python 和运行 Dask 分布式的最小依赖项。

如果您的代码需要外部依赖项,则必须确保将其安装在映像中。Dask docker 镜像支持通过设置EXTRA_APT_PACKAGES,EXTRA_CONDA_PACKAGESEXTRA_PIP_PACKAGES环境变量在运行时安装额外的包。

# worker-spec.yml

kind: Pod
metadata:
  labels:
    foo: bar
spec:
  restartPolicy: Never
  containers:
  - image: daskdev/dask:latest
    imagePullPolicy: IfNotPresent
    args: [dask-worker, --nthreads, '2', --no-dashboard, --memory-limit, 6GB, --death-timeout, '60']
    name: dask
    env:
      - name: EXTRA_APT_PACKAGES
        value: packagename  # Some package to install with `apt install`
      - name: EXTRA_PIP_PACKAGES
        value: packagename  # Some package to install with `pip install`
      - name: EXTRA_CONDA_PACKAGES
        value: packagename  # Some package to install with `conda install`
    resources:
      limits:
        cpu: "2"
        memory: 6G
      requests:
        cpu: "2"
        memory: 6G
from dask_kubernetes import KubeCluster

cluster = KubeCluster.from_yaml('worker-spec.yml')

这样做的缺点是每次工作人员启动时都必须安装软件包,这会使自适应扩展变慢。因此,您也可以创建自己的 Docker 映像,并安装所有依赖项并将其发布到 Docker Hub。然后在您的配置中使用它。

kind: Pod
metadata:
  labels:
    foo: bar
spec:
  restartPolicy: Never
  containers:
  - image: me/mycustomimage:latest
    imagePullPolicy: IfNotPresent
    args: [dask-worker, --nthreads, '2', --no-dashboard, --memory-limit, 6GB, --death-timeout, '60']
    name: dask
    resources:
      limits:
        cpu: "2"
        memory: 6G
      requests:
        cpu: "2"
        memory: 6G

推荐阅读