何时使用 Spark 与 Ray

使用 Azure Databricks,可以在相同的执行环境中运行 Ray 和 Spark 操作。 两种引擎相结合为分发几乎任何类型的 Python 应用程序提供了一种强大的解决方案。

通常,Spark 和 Ray 对于特定任务类型具有其独特优势。

Ray 擅长任务并行 - 同时运行一组独立的任务。

Spark 擅长数据并行 - 对大型数据集的每个元素应用相同的操作。

何时使用 Spark

  • 大规模数据处理:对于涉及大量数据处理的大多数用例,强烈建议使用 Spark,因为它针对表联接、筛选和聚合等任务进行了优化。
  • 数据并行:Spark 擅长数据并行,它涉及对大型数据集的每个元素应用相同的操作。 它是 ETL、分析报告、特征工程和数据预处理的理想选择。
  • 机器学习:Spark 的 MLlib 和 SparkML 库针对大规模机器学习算法和统计建模进行了优化。

何时使用 Ray

  • 任务并行:Ray 专为任务并行而设计,其中多个任务可同时且独立运行。 它对于以计算为中心的任务特别高效。
  • 特定工作负载:将 Ray 用于 Spark 优化程度较低的工作负载,例如强化学习、分层时序预测、模拟建模、超参数搜索、深度学习训练和高性能计算 (HPC)。

何时同时使用 Ray 和 Spark

  • 共享模式执行:可以在与 Spark 相同的环境中运行 Ray 群集,从而允许在单个应用程序中利用这两个框架。 使用 Spark 执行数据密集型任务,并切换到 Ray 执行需要大量计算的阶段。
  • 高效的数据检索:在某些情况下,Spark 只能用于高效数据检索,而 Ray 则处理复杂的计算任务。

工作流体系结构模式

下面是建议用于在同一工作流中集成 Spark 和 Ray 管道的模式。

在子任务中隔离 ETL

可以在 Azure Databricks Workflow 中将主要数据提取-转换-加载 (ETL) 部分隔离并分离到其自己的子任务中。 这样,便可以将群集类型与 ETL 工作负载的类型匹配,并避免 Ray 和 Spark 之间的资源共享问题。

在单个任务中合并 Ray 和 Spark

若要将 Ray 和 Spark 合并到单个任务中,Azure Databricks 建议采用以下模式之一:

  • Spark 用于数据处理,Ray 用于计算

    使用 Spark 管理输入和输出数据操作。 例如,使用 databricks.ray.data.from_spark 将训练数据从 Spark 传递到 Ray Data。 将输出模型保存到 MLflow 或将数据集保存到 Unity Catalog 表。

  • Spark 函数中的 Ray(高级)

    在 Spark 函数(如 UDF 或结构化流 foreachBatch 操作)中运行 Ray。

  • 并发 Spark 和 Ray 操作(高级)

    与 Ray 函数一起运行 Spark 操作。 例如,使用 Spark 查询 Ray 任务中的数据或在 Ray 仍在运行时写入输出数据。

若要详细了解如何在单个任务中结合使用 Ray 和 Spark,请参阅在 Azure Databricks 上的相同环境中合并 Ray 和 Spark

在单个任务中结合使用 Ray 和 Spark 时的资源管理

由于任务调度,资源冲突很少发生,但可以通过配置资源分配来进行管理,以确保两个框架都具有足够的内存、CPU 和/或 GPU 可用性。

以下示例展示了如何在启动 Ray 群集时使用设置配置参数在 Ray 和 Spark 之间拆分资源。 根据需要调整群集大小或分配给 Ray 工作器节点的 CPU 数,以防止争用。

from ray.util.spark import setup_ray_cluster, shutdown_ray_cluster

# For a Databricks cluster configured with autoscaling enabled,
# The minimum worker nodes of 4 and maximum of 6 nodes.
# 2 Spark-only nodes will launch when needed.
# The Ray cluster will have 4 nodes allocated for its use.
setup_ray_cluster(
  min_worker_nodes=4,
  max_worker_nodes=4,
)

# Pass any custom Ray configuration with ray.init
ray.init()

后续步骤

了解如何连接 Spark 和 Ray,以便为共享工作负载在它们之间传递数据。