常见问题
目录
常见问题¶
问题: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 即服务。目前人们在 Kubernetes 上使用 Dask 的方式如下
Helm:一种轻松搭建长期运行的 Dask 集群和 Jupyter notebook 的方法
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 风格的 Shuffle 系统。我们不使用 MPI 风格的集体通信。所有通信都是直接的点对点通信。
对于高性能网络,您可以使用 TCP-over-Infiniband 来获得约 1 GB/s 的带宽,或者使用 UCX(实验性)来获得全速通信。
部署是长期运行的还是临时的?¶
我们两种都看到,但临时部署更常见。
当今大多数 Dask 的使用是为了使数据科学或数据工程用户能够将其交互式工作负载扩展到集群上。这些通常是与 Jupyter 的交互式会话,或者在预定义时间运行的批处理脚本。在这两种情况下,用户都会向资源管理器请求一批机器,完成一些工作,然后释放这些机器。
一些机构也以常驻方式使用 Dask,要么以可扩展的方式处理实时流量,要么响应大量交互式用户,这些用户处理 Dask 保留在内存中的大型数据集。
托管 Dask 的资源管理器,例如 Yarn 或 Kubernetes,通常为常驻运行提供长期的 24/7 弹性。
假设您的机构中的绝大多数业务逻辑行是 Python 编写的,并使用 Numpy、Pandas 和 Scikit-Learn 等工具,那么它们将无需更改。
我们目前看到的最大的 Dask 部署在约 1000 台多核机器上,总计可能达到 20,000 个核心,但这很少见。大多数机构级别的问题(1-100 TB)通过 10-50 个节点的部署就能很好地解决。技术上,需要记住一个粗略估算的数字:Dask 中的每个任务(单个 Python 函数调用)开销约为 200 微秒。因此,如果每个任务需要 1 秒,那么 Dask 可以饱和约 5000 个核心,之后调度开销将成为主要成本。当工作负载达到此限制时,建议使用更大的块大小来补偿。但是,绝大多数机构用户没有达到此限制。更多信息,您可以查阅我们的 最佳实践
Dask 有弹性吗?当机器宕机时会发生什么?¶
是的,Dask 对工作节点故障具有弹性。它知道如何得出任何结果,如果一个节点宕机,它可以在其他机器上重播必要的工作。
如果 Dask 的中心调度器宕机,则需要重新提交计算。这是目前相当标准的弹性水平,与 Apache Spark、Flink 等其他工具共享。
托管 Dask 的资源管理器,例如 Yarn 或 Kubernetes,通常为常驻运行提供长期的 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, text
数组: HDF5, NetCDF, Zarr, GRIB
更一般地说,如果您有一个 Python 函数可以将您的存储数据的一个块转换为 Pandas DataFrame 或 Numpy 数组,那么 Dask 可能无需太多努力就可以多次调用该函数。
对于寻求使用哪种格式的建议的群体,我们建议表格使用 Parquet,数组使用 Zarr 或 HDF5。
Dask 有 SQL 接口吗?¶
Dask 支持多种与 SQL 数据库通信的方式,其中一些需要安装额外的包;请参阅 Dask DataFrame 和 SQL 部分。
Dask 在 GPU 上工作吗?¶
是的!Dask 可以通过几种方式与 GPU 协同工作。
的 RAPIDS 库提供了一个 GPU 加速的类 Pandas 库 cuDF,它与 Dask DataFrame 具有良好的互操作性并经过测试。
Chainer 的 CuPy 库提供了一个 GPU 加速的类 NumPy 库,它与 Dask Array 完美互操作。
对于自定义工作流,人们将 Dask 与 PyTorch 和 TensorFlow 等 GPU 加速库一起使用,以管理跨多台机器的工作负载。他们通常使用 Dask 的自定义 API,特别是 Delayed 和 Futures。
请参阅 GPU 部分。