使用 Azure Databricks,可以在相同的执行环境中运行 Ray 和 Spark 操作。 两种引擎相结合为分发几乎任何类型的 Python 应用程序提供了一种强大的解决方案。
通常,Spark 和 Ray 对于特定任务类型具有其独特优势。
Ray 擅长任务并行 - 同时运行一组独立的任务。
Spark 擅长数据并行 - 对大型数据集的每个元素应用相同的操作。
- 大规模数据处理:对于涉及大量数据处理的大多数用例,强烈建议使用 Spark,因为它针对表联接、筛选和聚合等任务进行了优化。
- 数据并行:Spark 擅长数据并行,它涉及对大型数据集的每个元素应用相同的操作。 它是 ETL、分析报告、特征工程和数据预处理的理想选择。
- 机器学习:Spark 的 MLlib 和 SparkML 库针对大规模机器学习算法和统计建模进行了优化。
- 任务并行:Ray 专为任务并行而设计,其中多个任务可同时且独立运行。 它对于以计算为中心的任务特别高效。
- 特定工作负载:将 Ray 用于 Spark 优化程度较低的工作负载,例如强化学习、分层时序预测、模拟建模、超参数搜索、深度学习训练和高性能计算 (HPC)。
- 共享模式执行:可以在与 Spark 相同的环境中运行 Ray 群集,从而允许在单个应用程序中利用这两个框架。 使用 Spark 执行数据密集型任务,并切换到 Ray 执行需要大量计算的阶段。
- 高效的数据检索:在某些情况下,Spark 只能用于高效数据检索,而 Ray 则处理复杂的计算任务。
下面是建议用于在同一工作流中集成 Spark 和 Ray 管道的模式。
可以在 Azure Databricks Workflow 中将主要数据提取-转换-加载 (ETL) 部分隔离并分离到其自己的子任务中。 这样,便可以将群集类型与 ETL 工作负载的类型匹配,并避免 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
由于任务调度,资源冲突很少发生,但可以通过配置资源分配来进行管理,以确保两个框架都具有足够的内存、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,以便为共享工作负载在它们之间传递数据。