与Spark的比较

Apache Spark 是一个流行的分布式计算工具,适用于表格数据集,正在成为当今大数据分析领域的主导名称。Dask 有几个元素似乎与这个领域相交,我们经常被问到,“Dask 与 Spark 相比如何?”

以公正且知情的态度回答这类比较问题是很困难的,尤其是在差异可能有些技术性的时候。本文档试图做到这一点;我们欢迎任何更正。

摘要

通常情况下,Dask 比 Spark 更小巧、更轻量。这意味着它具有较少的功能,而是与其他库结合使用,特别是与数值 Python 生态系统中的库结合使用。它与 Pandas 或 Scikit-Learn 等库结合,以实现高级功能。此外,Dask 在 标准基准测试 中通常比 Spark 更快且性能更稳健。

语言

  • Spark 是用 Scala 编写的,同时支持 Python 和 R。它与其它 JVM 代码有良好的互操作性。

  • Dask 是用 Python 编写的,并且仅真正支持 Python。它与通过 Python 链接的 C/C++/Fortran/LLVM 或其他本地编译代码互操作良好。

生态系统

  • Spark 是一个集大成的项目,它激发了自身的生态系统。它与许多其他 Apache 项目集成得很好。

  • Dask 是更大的 Python 生态系统的一个组件。它与 NumPy、pandas 和 Scikit-learn 等其他库结合并增强了这些库的功能。

年龄与信任

  • Spark 更早(自2010年起),并且已成为大数据企业世界中占主导地位且值得信赖的工具。

  • Dask 更年轻(自2014年起),并且是广受信任的 NumPy/pandas/Scikit-learn/Jupyter 堆栈的扩展。

范围

  • Spark 更专注于传统的商业智能操作,如 SQL 和轻量级机器学习。

  • Dask 不仅广泛应用于商业智能应用,还适用于多种科学和定制场景。

内部设计

  • Spark 的内部模型更高级,为统一应用的计算提供了良好的高级优化,但在更复杂的算法或临时系统方面缺乏灵活性。它本质上是对 Map-Shuffle-Reduce 范式的扩展。

  • Dask 的内部模型是较低层次的,因此缺乏高级优化,但能够实现更复杂的算法并构建更复杂的定制系统。它从根本上基于通用任务调度。

规模

  • Spark 可以从单个节点扩展到数千节点的集群。

  • Dask 可以从单个节点扩展到千节点集群。

API

数据框

  • Spark DataFrame 有自己的 API 和内存模型。它还实现了 SQL 语言的一个大型子集。Spark 包含一个用于复杂查询的高级查询优化器。

  • Dask DataFrame 重用了 Pandas API 和内存模型。它既没有实现 SQL 也没有实现查询优化器。它能够进行随机访问、高效的时间序列操作以及其他 Pandas 风格的索引操作。

机器学习

  • Spark MLLib 是一个支持常见操作的紧密项目,这些操作易于使用 Spark 的 Map-Shuffle-Reduce 风格系统实现。考虑使用 MLLib 的人可能也想考虑 其他 JVM 基础的机器学习库,如 H2O,它们可能有更好的性能。

  • Dask 依赖并与其他现有库如 Scikit-learn 和 XGBoost 互操作。这些库可能更熟悉或性能更高,但通常会导致整体性较差。请参阅 dask-ml 项目以了解集成情况。

数组

  • Spark 本身不支持多维数组(考虑到其计算模型,这将是具有挑战性的),尽管在 MLLib 中可能找到一些对二维矩阵的支持。人们也可能希望查看 Thunder 项目,该项目结合了 Apache Spark 和 NumPy 数组。

  • Dask 完全支持 NumPy 的 可扩展多维数组 模型。

流式传输

  • Spark 对流数据的支持是一流的,并且与其他 API 很好地集成。它遵循微批处理方法。这在大规模均匀流操作中提供了不错的性能。

  • Dask 提供了一个 实时 futures 接口,它比 Spark 流处理更底层。这使得更多的创意和复杂用例成为可能,但比 Spark 流处理需要更多的工作。

图 / 复杂网络

  • Spark 提供了 GraphX,一个用于图处理的库。

  • Dask 没有提供这样的库。

自定义并行性

  • Spark 通常期望用户通过其高级原语(map、reduce、groupby、join等)来组合计算。虽然通过子类化 RDD 来扩展 Spark 也是可能的,但这种情况很少发生。

  • Dask 允许你为更复杂和自定义的系统指定任意的任务图,这些系统不属于标准集合的一部分。

你可能选择 Spark 的原因

  • 你更喜欢 Scala 还是 SQL 语言

  • 你主要拥有JVM基础设施和遗留系统

  • 您需要一个成熟且值得信赖的商业解决方案

  • 你主要从事商业分析,辅以一些轻量级的机器学习

  • 你想要一个一体化的解决方案

你可能选择 Dask 的原因

  • 您更喜欢 Python 还是原生代码,或者您有大量的遗留代码库,您不希望完全重写。

  • 你的用例很复杂,或者不适合Spark计算模型

  • 您希望从本地计算到集群计算的过渡更轻量级

  • 您希望与其他技术互操作,并且不介意安装多个软件包

选择两者的理由

在同一数据和同一集群上同时使用 Dask 和 Spark 非常容易。

它们都可以读写常见的格式,如 CSV、JSON、ORC 和 Parquet,这使得在 Dask 和 Spark 工作流之间传递结果变得容易。

它们都可以部署在相同的集群上。大多数集群设计为同时支持许多不同的分布式系统,使用 Kubernetes 和 YARN 等资源管理器。如果你已经有一个运行 Spark 工作负载的集群,那么在你当前的基础设施上运行 Dask 工作负载也很可能是容易的,反之亦然。

特别是对于来自传统 Hadoop/Spark 集群(如 Cloudera/Hortonworks 销售的集群)的用户,您使用的是 Yarn 资源管理器。您可以使用 Dask Yarn 项目在这些系统上部署 Dask,以及其他项目,如 `JupyterHub on Hadoop <https://jupyterhub-on-hadoop.readthedocs.io/en/latest/>>`_

面向开发者的差异

图的粒度

Spark 和 Dask 都使用有向无环图来表示计算。然而,这些图在表示计算的粒度上存在很大差异。

在Spark RDD上的一个操作可能会在图中添加一个节点,如 MapFilter。这些是传达意义的高级操作,最终将被转换为许多小任务在各个工作节点上执行。这种许多小任务的状态仅在Spark调度器内部可用。

Dask 图跳过这种高级表示,直接进入许多小任务阶段。因此,对 Dask 集合的一次 map 操作将立即生成并添加可能成千上万的小任务到 Dask 图中。

底层图规模上的这种差异对可以进行的分析和优化类型以及向用户暴露的通用性有影响。Dask无法执行Spark可以执行的一些优化,因为Dask调度器没有所请求执行的计算的顶层视图。然而,Dask能够轻松表示更复杂的 算法 ,并将这些算法的创建暴露给普通用户。

结论

  • Spark 成熟且全面。如果你想找一个能做所有事情的项目,并且你已经在使用大数据硬件,那么 Spark 是一个安全的选择,特别是如果你的用例是典型的 ETL + SQL,并且你已经在使用 Scala。

  • Dask 更轻量级,并且更容易集成到现有的代码和硬件中。如果你的问题超出了典型的 ETL + SQL 范畴,并且你希望为现有解决方案添加灵活的并行性,那么 Dask 可能是一个不错的选择,特别是如果你已经在使用 Python 及其相关库如 NumPy 和 Pandas。

如果你要管理100GB或更少的表格CSV或JSON数据,那么你应该忘记Spark和Dask,使用Postgres_或MongoDB