常见问题解答
内容
常见问题解答¶
问题:Dask 是否适合在更大的机构环境中采用?
答案: 是的。 Dask 被世界上最大的银行、国家实验室、零售商、科技公司和政府机构使用。它被用于高度安全的环境中。它也被用于保守的机构以及快速发展的机构。
本页包含机构和用户在首次调查 Dask 时经常提出的问题和关注点。
对于管理¶
简而言之,Dask 为我们解决了什么问题?¶
Dask 是一个通用的并行编程解决方案。因此,它以 多种 不同的方式被使用。
然而,Dask解决的最常见问题是将Python分析师连接到分布式硬件,特别是在数据科学和机器学习工作负载方面。Dask影响最大的机构是那些拥有大量Python用户,这些用户习惯于使用NumPy、Pandas、Jupyter、Scikit-Learn等库,但希望将这些工作负载扩展到集群中。通常,他们还拥有未充分利用的分布式计算资源。
Dask消除了技术上和文化上的障碍,以一种对用户和IT都自然的方式将Python用户连接到计算资源。
“帮助我将笔记本扩展到集群上” 是当今机构常见的痛点,也是Dask使用的常见入口点。
Dask 成熟吗? 我们为什么要信任它?¶
是的。虽然 Dask 本身相对较新(始于2015年),但它是由 NumPy、Pandas、Jupyter、Scikit-Learn 开发者社区构建的,这个社区非常值得信赖。Dask 是这些库之上的一个相对较薄的封装,因此,这个项目可以相对较小且简单。它并没有重新发明一个全新的系统。
此外,这种与更广泛技术栈的紧密集成从长远来看带来了实质性的好处。例如:
因为 Pandas 维护者同时也维护 Dask,当 Pandas 发布新版本时,Dask 也会同时发布新版本,以确保连续性和兼容性。
因为 Scikit-Learn 的维护者在训练大型集群时维护并使用 Dask,你可以确信 Dask-ML 专注于实用且重要的解决方案,如 XGBoost 集成、超参数选择,并且两者之间的集成对于新手和专家用户来说都感觉自然。
因为 Jupyter 维护者同时也维护 Dask,强大的 Jupyter 技术如 JupyterHub 和 JupyterLab 都是以 Dask 的需求为设计考虑,并且新功能会迅速推出,以提供一流且现代的用户体验。
此外,Dask 由广泛的维护者社区以及 Anaconda(领先的数据科学发行版背后的公司)和 NVIDIA(领先的 GPU 硬件制造商)提供的实质性机构支持(每个机构都有多名全职员工)共同维护。尽管有大型企业的支持,Dask 仍然是一个社区主导的项目,并由 NumFOCUS 提供财务赞助,NumFOCUS 是与 NumPy、Pandas、Jupyter 等众多项目相同的 501c3 组织。
还有谁使用 Dask?¶
Dask 今天被几乎所有领域的个人研究人员使用。它每月有数百万次下载,并且今天已经集成到许多 PyData 软件包中。
在 机构 层面上,Dask 被分析和研究团队在广泛领域中使用,这些领域涵盖了从充满活力的初创公司到大型保守的知名企业。网络搜索显示了 Capital One、Barclays、Walmart、NASA、Los Alamos 国家实验室以及数百家其他类似机构的文章。
Dask 与 Apache Spark 相比如何?¶
这个问题有更长和更技术性的覆盖 这里
Dask 和 Apache Spark 相似之处在于它们都…
为数据科学Python用户提供简单的并行性承诺
为 ETL、数据科学和机器学习提供 DataFrame 和 ML API
扩展到相似的规模,大约1-1000台机器
Dask 与 Apache Spark 在几个方面有所不同:
Dask 更贴近 Python 原生,而 Spark 则是 Scala/JVM 原生,带有 Python 绑定。
Python 用户可能会觉得 Dask 更舒适,但 Dask 仅对 Python 用户有用,而 Spark 也可以从 JVM 语言中使用。
Dask 是 Python 生态系统中的一个组件,与 Numpy、Pandas 和 Scikit-Learn 等库并列,而 Spark 则是一个一体化的系统,它在单个包中重新发明了 Python 世界的许多部分。
这意味着通常更容易用新的问题领域来组合 Dask,但同时也意味着你需要安装多个东西(如 Dask 和 Pandas 或 Dask 和 Numpy),而不是仅仅拥有一个一体化的解决方案。
Apache Spark 非常注重传统的商业智能工作负载,如 ETL、SQL 查询,以及一些轻量级的机器学习,而 Dask 则用途更为广泛。
这意味着 Dask 更加灵活,可以处理多维数组、GIS、高级机器学习以及自定义系统等其他问题领域,但在典型的 SQL 风格计算方面,它的专注度和调优程度较低。
如果你主要想专注于SQL查询,那么Spark可能是更好的选择。如果你想支持多种自定义工作负载,那么Dask可能更自然。
参见章节 与Spark的比较。
有我们可以获得支持的公司吗?¶
有几家公司以不同的方式提供对 Dask 的支持。请参阅 付费支持 以获取完整列表。
对于IT¶
如何在机构硬件上设置 Dask?¶
您已经拥有集群资源。Dask 今天就可以在它们上面运行,无需重大改动。
当今大多数机构集群都有一个资源管理器。这通常由IT部门管理,用户被赋予一些轻微的权限来启动作业。Dask与当今所有主要的资源管理器兼容,包括Hadoop、HPC、Kubernetes和云集群上的那些。
Hadoop/Spark:如果你有一个 Hadoop/Spark 集群,例如通过 Cloudera/Hortonworks/MapR 购买的集群,那么你可能会想使用 YARN 部署 Dask,YARN 是部署 Hadoop、Spark、Hive 等服务资源管理器。
为了帮助解决这个问题,您可能需要使用 Dask-Yarn。
HPC: 如果你有一个运行资源管理器如SGE、SLURM、PBS、LSF、Torque、Condor或其他作业批处理排队系统的HPC机器,那么用户今天可以使用以下任一方式在这些系统上启动Dask:
Dask Jobqueue ,它在交互式环境中使用典型的
qsub
、sbatch
、bsub
或其他提交工具。Dask MPI 使用 MPI 在批处理环境中进行部署
更多信息请参见 高性能计算机
Kubernetes/云: 较新的集群可能会采用 Kubernetes 进行部署。这在当今主要云提供商中尤为常见,所有这些提供商都提供托管的 Kubernetes 作为服务。人们今天使用 Dask 在 Kubernetes 上运行,使用以下任一方式:
Helm:一种轻松搭建长期运行的 Dask 集群和 Jupyter 笔记本的方法
Dask-Kubernetes: 用于快速移动或临时部署的原生 Kubernetes 集成。
更多信息请参见 Kubernetes
商业 Dask 部署:
您可以使用 Coiled 来处理在云计算环境(AWS 和 GCP)中 Dask 集群的创建和管理。
Domino Data Lab 允许用户在托管平台上创建 Dask 集群。
Saturn Cloud 允许用户在托管平台上或在其自己的 AWS 账户内创建 Dask 集群。
Dask 安全吗?¶
Dask 今天部署在高度安全的机构中,包括主要的金融、医疗和政府机构。
话虽如此,值得注意的是,Dask 本质上允许在大规模机器上执行任意用户代码。应采取措施隔离、认证和管理对这些机器的访问。幸运的是,您的机构可能已经这样做了,并使用 SSL/TLS、Kerberos 等标准技术,Dask 可以与之集成。
我需要购买一个新的集群吗?¶
不。今天在大多数集群上运行 Dask 很容易。如果你有一个现有的 HPC 或 Spark/Hadoop 集群,那么这将非常适合开始运行 Dask。
您可以开始使用 Dask 而无需任何资本支出。
如何管理用户?¶
Dask 不管理用户,您可能已经有现有的系统可以很好地完成这项工作。在大型机构环境中,我们假设您已经有一个资源管理器,如 Yarn (Hadoop)、Kubernetes 或 PBS/SLURM/SGE/LSF/…,每个资源管理器都有出色的用户管理能力,这些能力很可能是您的 IT 部门所偏好的。
Dask 设计为在用户级权限下运行,这意味着您的数据科学用户应该能够向上述系统请求资源,并相应地跟踪其进程。
然而,有些机构不允许分析师级别的用户直接访问集群。这在Cloudera/Hortonworks Hadoop/Spark部署中尤为常见。在这种情况下,可能需要某种程度的显式间接访问。为此,我们推荐 Dask Gateway项目 ,它使用IT级别的权限来正确地将经过身份验证的用户路由到安全资源。
您可能还想考虑托管集群解决方案(参见 托管集群解决方案)。
如何管理软件环境?¶
这取决于你的集群资源管理器:
大多数HPC用户使用他们的网络文件系统
Hadoop/Spark/Yarn 用户将其环境打包成一个 tarball,并通过 HDFS 进行传输(Dask-Yarn 与 Conda Pack 集成以实现此功能)
Kubernetes 或云用户使用 Docker 镜像
在每种情况下,Dask 都与现有的、已被机构理解和熟悉的流程和技术集成。
Dask 如何在机器之间传输数据?¶
Dask 通常通过 TCP 进行通信,使用 msgpack 处理小的管理消息,并使用自己的协议高效传递大数据。调度器和每个工作节点都运行自己的 TCP 服务器,使得 Dask 成为一个分布式的点对点网络,采用点对点通信。我们不使用 Spark 风格的洗牌系统。我们不使用 MPI 风格的集体通信。所有通信都是直接的点对点。
对于高性能网络,您可以使用 TCP-over-Infiniband 来实现大约 1 GB/s 的带宽,或者使用 UCX(实验性)来实现全速通信。
部署是长期运行的,还是短暂的?¶
我们两者都看到,但短暂的部署更为常见。
如今大多数Dask的使用是为了让数据科学或数据工程用户能够将他们的交互式工作负载扩展到整个集群。这些通常要么是与Jupyter的交互式会话,要么是按预定时间运行的批处理脚本。在这两种情况下,用户向资源管理器请求一批机器,完成一些工作,然后放弃这些机器。
一些机构也以持续运行的方式使用 Dask,无论是以可扩展的方式处理实时流量,还是响应拥有大数据集的广泛互动用户,这些数据集始终驻留在内存中。
对于用户¶
Dask 会在我们现有的代码上“正常工作”吗?¶
不,你需要进行修改,但这些修改通常很小。
假设您的机构中的大多数业务逻辑代码是用Python编写的,并且使用了Numpy、Pandas和Scikit-Learn等工具,那么这些代码中的绝大部分将不需要更改。
Dask 的扩展性如何?Dask 有哪些局限性?¶
我们今天看到的最大的 Dask 部署大约在 1000 台多核机器上,总共可能有 20,000 个核心,但这些情况很少见。大多数机构级别的问题(1-100 TB)通过 10-50 个节点的部署就能很好地解决。
从技术上讲,需要记住的一个粗略数字是,Dask 中的每个任务(一个单独的 Python 函数调用)大约有 200 微秒 的开销。因此,如果这些任务每个需要 1 秒,那么 Dask 可以在调度开销主导成本之前饱和大约 5000 个核心。当工作负载达到这个限制时,建议使用更大的块大小来补偿。不过,绝大多数 机构用户并没有达到这个限制。如需更多信息,您可能需要浏览我们的 最佳实践
Dask 有弹性吗?当一台机器宕机时会发生什么?¶
是的,Dask 能够应对工作节点故障。它知道如何得到任何结果,如果一个节点宕机,它可以在其他机器上重放必要的工作。
如果 Dask 的集中式调度器宕机,那么你需要重新提交计算任务。这是当今相当标准的弹性水平,与其他工具如 Apache Spark、Flink 等共享。
像 Yarn 或 Kubernetes 这样的 Dask 托管资源管理器,通常为全天候 24/7 的持续运行提供长期弹性。
API 与 NumPy/Pandas/Scikit-Learn 完全相同吗?¶
不,但它非常接近。尽管如此,你的数据科学家仍然需要学习一些东西。
我们发现,当机构采用 Dask 时,Numpy/Pandas/Scikit-Learn 的 API 并不是挑战。当 API 不一致确实存在时,即使是技能一般的程序员也能够理解原因,并相对轻松地绕过它们。
相反,挑战在于建立对并行性能的直觉。我们都对单台机器上的快慢建立了一个心理模型。当考虑到网络通信和并行算法时,这个模型会发生变化,我们熟悉的操作的性能可能会出乎意料。
我们构建这种直觉的主要解决方案,除了积累的经验外,是 Dask 的 诊断仪表盘。仪表盘在用户运行计算时提供了大量的视觉反馈,帮助他们理解正在发生的事情。这不仅帮助他们识别和解决即时的瓶颈,而且还能惊人地快速建立起并行性能的直觉。
Dask 需要多少性能调优?¶
其他一些系统以难以调优到最佳性能而著称。Dask 在这方面的情况如何?我们需要注意多少个参数?
像Python软件工具的其他部分一样,Dask在设定合理的默认值方面投入了大量精力。Dask工作者会自动检测可用的内存和核心,并选择在大多数情况下表现良好的合理默认值。Dask算法同样默认提供合理的选择,并在遇到棘手情况时提供信息性警告,因此在常见情况下,事情应该会顺利进行。
最常见的调整参数包括以下内容:
处理持有GIL的计算(这在Numpy/Pandas/Scikit-Learn工作流中很少见)的线程/进程混合
分区大小,比如你是否应该有 100 MB 的块或 1 GB 的块
话虽如此,几乎没有一个机构的需要能完全被常见情况满足,而且考虑到人们向 Dask 提出的各种问题,特殊问题是非常常见的。在这些情况下,我们建议在执行过程中观察仪表板,看看发生了什么。它通常能告诉你哪里出了问题,这样你就可以对你的系统进行调整。
Dask 支持哪些数据格式?¶
因为 Dask 建立在 NumPy 和 Pandas 之上,它支持它们支持的大多数格式,也就是大多数格式。尽管如此,并非所有格式都适合并行访问。通常,使用以下格式的人通常都非常满意:
表格: Parquet, ORC, CSV, 行分隔的 JSON, Avro, 文本
数组: HDF5, NetCDF, Zarr, GRIB
更一般地,如果你有一个Python函数可以将存储的数据块转换为Pandas数据框或Numpy数组,那么Dask可能可以在不需要太多努力的情况下多次调用该函数。
对于寻找使用哪种格式建议的团队,我们推荐使用 Parquet 作为表格,Zarr 或 HDF5 作为数组。
Dask 有 SQL 接口吗?¶
Dask 支持多种与 SQL 数据库通信的方式,其中一些需要安装额外的包;请参阅 Dask 数据框和 SQL 部分。
Dask 能在 GPU 上运行吗?¶
是的!Dask 通过几种方式与 GPU 协同工作。
RAPIDS 库提供了一个 GPU 加速的类似 Pandas 的库,cuDF,它与 Dask DataFrame 很好地互操作并经过测试。
Chainer 的 CuPy 库提供了一个与 Dask Array 良好互操作的 GPU 加速的类 NumPy 库。
对于自定义工作流程,人们通常将 Dask 与 PyTorch 和 TensorFlow 等 GPU 加速库一起使用,以跨多台机器管理工作负载。他们通常使用 Dask 的自定义 API,特别是 延迟 和 未来。
参见章节 GPUs。