管理环境
内容
管理环境¶
在执行代码时,确保每个dask worker使用相同的python包和模块集是至关重要的,这样Dask才能正常工作。在与分布式 Client
连接时,Dask会自动检查一些关键包(包括Dask本身)的版本,并警告您任何不匹配的情况。
在 Dask 上运行的大多数函数都需要导入。即使传递的不是 Python 内置对象也是如此 - pickle 序列化方法会保存对导入模块的引用,而不是尝试发送所有源代码。
因此,您必须确保工作人员可以访问您需要的所有模块,并且理想情况下具有完全相同的版本。
单机调度器¶
如果你使用的是线程调度器,那么你不需要做任何事情,因为工作线程在同一个进程中,对象只是共享而不是序列化和反序列化。
同样地,如果你使用多进程调度器,新进程将会以与原始进程相同的方式被复制或启动,因此你只需要确保你没有更改与启动python和导入代码相关的环境变量(如PATH、PYTHONPATH、sys.path
)。
如果你在一台机器上使用分布式调度器,这大致相当于使用上述的多进程调度器,如果你是通过 Client(...)
或 LocalCluster(...)
启动的话。
然而,如果你是从命令行启动你的工作进程,那么你必须确保你在相同的环境中运行(virtualenv、pipenv 或 conda)。
本页的其余部分仅涉及分布式集群。
保持一致的环境¶
如果你自己管理环境,那么设置模块一致性可以像在每台机器上从相同的 pip 或 conda 规范创建环境一样简单。你应该查阅 pip
、pipenv
和 conda
的文档,无论你通常使用哪一个。你通常希望尽可能具体地指定包版本,并在安装前将相同的环境文件分发给工作节点。
然而,其他常见的直接分发环境的方式,而不是就地构建,包括:
docker 镜像,其中环境已经构建到镜像中;这是当你在由 docker 支持的基础设施上运行时,例如 kubernetes,通常的路径。
conda-pack 是一个用于打包现有 conda 环境的工具,以便它们可以被迁移到其他机器上。这个工具专门为 YARN/hadoop 集群上的 dask 创建,但也可以在其他地方使用
共享文件系统,例如 NFS,所有机器都可以访问。请注意,导入 Python 模块是相当 IO 密集型的,因此您的服务器需要能够处理许多请求。
集群安装方法(例如,parcels):根据您的基础设施,可能有一些方法可以将特定的二进制文件安装到集群中的所有工作节点。
临时安装¶
工作插件 distributed.diagnostics.plugin.PipInstall
允许你在工作节点上运行 pip 安装命令,并且可以选择在成功后重启它们。请阅读插件文档以了解如何使用此功能。
__main__
中的对象¶
你在没有任何模块引用的情况下创建的对象,例如在 repl 或笔记本单元格中直接定义的类,不会通过引用任何导入的模块进行序列化。你可以重新定义这些对象,Dask 将完全序列化它们,包括源代码。这在使用分布式设置时尝试新事物是一个不错的方法。
发送源¶
特别是在开发过程中,您可能希望将文件直接发送到已经在运行的工作进程。
在这些情况下,你应该使用 client.upload_file
。更多详情,请参阅 API 文档 和 StackOverflow 问题 “我可以在 Dask/Distributed 中使用从 .py 文件导入的函数吗?”。此函数支持独立文件和 setuptools 的 .egg
文件用于较大的模块。