常见问题
目录
常见问题¶
问题: Dask 是否适合在大型机构背景下采用?
答案: 是的。 Dask 已被全球最大的银行、国家实验室、零售商、科技公司和政府机构所采用。它在高度安全的环境中使用。它既被保守的机构使用,也被快速发展的机构使用。
本页包含机构和用户在首次考察 Dask 时经常提出的问题和关切。
面向管理者¶
简单来说,Dask 为我们解决了什么问题?¶
Dask 是一个通用的并行编程解决方案。因此,它被以多种不同方式使用。
然而,Dask 解决的最常见问题是将 Python 分析师连接到分布式硬件,特别是用于数据科学和机器学习工作负载。Dask 影响力最大的机构是那些拥有大量习惯使用 NumPy、Pandas、Jupyter、Scikit-Learn 等库的 Python 用户,但希望在集群上扩展这些工作负载的机构。通常他们也拥有未充分利用的分布式计算资源。
Dask 消除了技术和文化障碍,以一种用户和 IT 都熟悉的方式将 Python 用户连接到计算资源。
“帮我把我的 notebook 扩展到集群上”是当今机构的一个常见痛点,也是 Dask 使用的一个常见切入点。
Dask 成熟吗?为什么我们应该信任它?¶
是的。虽然 Dask 本身相对较新(始于 2015 年),但它由值得信赖的 NumPy、Pandas、Jupyter、Scikit-Learn 开发者社区构建。Dask 是这些库之上的一个相对轻薄的封装,因此项目相对较小且简单。它没有重新发明一个全新的系统。
此外,与更广泛的技术栈的紧密集成带来了长期的巨大好处。例如
由于 Pandas 的维护者也维护 Dask,因此当 Pandas 发布新版本时,Dask 会同时发布一个版本以确保连续性和兼容性。
由于 Scikit-Learn 的维护者在大型集群上训练时维护和使用 Dask,您可以放心,Dask-ML 专注于实用且重要的解决方案,如 XGBoost 集成和超参数选择,并且两者之间的集成对于新手和专家用户来说都非常自然。
由于 Jupyter 的维护者也维护 Dask,像 JupyterHub 和 JupyterLab 这样的强大 Jupyter 技术在设计时考虑了 Dask 的需求,并且新功能被迅速推出,以提供一流的现代化用户体验。
此外,Dask 由广泛的维护者社区以及 Anaconda(领先的数据科学发行版公司)和 NVIDIA(领先的 GPU 硬件制造商)提供大量的机构支持(各拥有几名全职员工)。尽管有大型企业支持,Dask 仍然是一个社区治理的项目,并由 NumFOCUS 提供财政赞助,NumFOCUS 是一个 501c3 组织,也为 NumPy、Pandas、Jupyter 和许多其他项目提供财政赞助。
还有谁使用 Dask?¶
如今,几乎在所有领域,Dask 都被个人研究人员使用。它每月有数百万次下载,并且已集成到当今许多 PyData 软件包中。
在机构层面,Dask 被分析和研究团队在广泛的领域中使用,包括充满活力的初创公司和大型保守的知名企业。网络搜索显示,Capital One、Barclays、Walmart、NASA、Los Alamos 国家实验室以及数百家其他类似机构都有使用 Dask 的文章。
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 会“直接兼容”我们现有的代码吗?¶
不会,您需要进行修改,但这些修改通常很小。
您机构内的大多数业务逻辑代码行都不需要更改,前提是它们是用 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 等其他工具共享。
托管 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, 文本
数组数据: 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 一节。