docker - 在dask中,运行本身运行docker容器的任务的最简单方法是什么?
问题描述
以下代码将函数映射到可迭代对象上。应用于每个元素的函数运行一个 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 中通过云计算资源并行化这种计算的最简单方法是什么?
例如,如果可以执行以下操作,那就太好了。但这当然不起作用,因为在 Fargate 上执行 python 代码的 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
在基于容器的任务中使用来启动临时集群,以执行所需的计算工作。
推荐阅读
- api - Amadeus API 返回所有请求的内部错误(生产密钥)
- android - 每个线程在 Android 中都有自己的处理程序吗?
- php - 上传的图片坏了。Laravel 日志显示 production.ERROR: Call to undefined function Illuminate Illuminate\Filesystem\finfo_file()
- c++ - Ofstream 似乎没有输出
- rxjs - 为什么 subject.onNext(3) 在这里打印?
- javascript - 动态添加/删除表单组并为每个输入提供唯一的 ID 和名称
- node.js - 在服务器中部署时将 API 请求路由到 MEAN 应用程序中的节点服务器
- vba - 如果数据源没有记录,则跳过 MS Word 邮件合并
- perl - 我应该使用哪种 OAuth2 授权类型?
- c# - 使控制台窗口脱离“选择模式”以防止崩溃