簡體   English   中英

在 dask 中,運行本身運行 docker 容器的任務的最簡單方法是什么?

[英]In dask, what is the easiest way to run a task that itself runs a docker container?

以下代碼將函數映射到可迭代對象上。 應用於每個元素的函數運行一個 docker 容器以計算其返回值:

import subprocess

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

args = [1, 2, 3]
for result in map(task, args):
    print(result.decode("utf-8").strip())
result_1
result_2
result_3

在 dask 中通過雲計算資源並行化此計算的最簡單方法是什么?

例如,如果可以執行以下操作,那就太好了。 但這當然不起作用,因為在其中執行 python 代碼的 Fargate 上的 docker 容器正在運行默認的 dask 映像,因此沒有能力自己生成 docker 容器(我不確定是否有或不是這個“docker-in-docker”方向的解決方案):

import subprocess

from dask.distributed import Client
from dask_cloudprovider import FargateCluster
import dask.bag

def task(arg):
    return subprocess.check_output(
        ["docker", "run", "ubuntu", "bash", "-c", f"echo 'result_{arg}'"]
    )

cluster = FargateCluster(n_workers=1)
client = Client(cluster)
args = [1, 2, 3]
for result in dask.bag.from_sequence(args).map(task).compute():
    print(result)

我正在尋找一種解決方案,它不涉及在同一個 docker 映像中包含無關代碼。 即我希望我的任務用於計算的 docker 圖像是一個任意的第三方圖像,我不必通過添加 python/dask 依賴項來更改它。 所以我認為這排除了基於更改dask_cloudprovider.FargateCluster/ECSCluster下工作節點使用的圖像的解決方案,因為這將不得不容納 python/dask 依賴項。

將容器拉到 kubernetes 節點上會產生很大的開銷,並且只有在任務長時間運行(幾分鍾、幾小時)時才真正合理。 dask面向基於 Python 的低開銷任務。

在我看來, dask不是執行容器映像任務的正確工具。 還有其他幾種技術可以更好地支持基於容器的任務/工作流的執行(例如 Airflow 的 KubernetesExecutor 或 Argo Workflows)。

您可能會考慮在基於容器的任務中使用dask_kubernetes來啟動臨時集群,以執行所需的計算工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM