Azure 机器学习中的 Apache Spark

借助 Azure 机器学习与 Azure Synapse Analytics 的集成,可通过 Apache Spark 框架轻松访问分布式计算资源。 此集成提供以下 Apache Spark 计算体验:

  • 无服务器 Spark 计算
  • 附加的 Synapse Spark 池

无服务器 Spark 计算

有了 Apache Spark 框架,若要在 Azure 机器学习环境中完成分布式计算任务,最简单的方法是使用 Azure 机器学习无服务器 Spark 计算。 Azure 机器学习提供完全托管的无服务器按需 Apache Spark 计算群集。 其用户无需同时创建 Azure Synapse 工作区和 Synapse Spark 池。

用户可以定义资源(包括实例类型和 Apache Spark 运行时版本)。 然后,他们可使用这些资源访问 Azure 机器学习笔记本中的无服务器 Spark 计算,来实现以下目的:

考虑的要点

无服务器 Spark 计算适用于大多数需要通过 Apache Spark 快速访问分布式计算资源的用户方案。 但是,若要做出明智的决策,用户应考虑此方法的优点和缺点。

优点:

  • 不依赖于为 Apache Spark 创建其他 Azure 资源(Azure Synapse 基础结构在后台运行)。
  • 无需订阅权限即可创建与 Azure Synapse 相关的资源。
  • 无需 SQL 池配额。

缺点:

  • 缺少持久性 Hive 元存储。 无服务器 Spark 计算仅支持内存中 Spark SQL。
  • 没有可用的表或数据库。
  • 缺少 Azure Purview 集成。
  • 没有可用的链接服务。
  • 数据源和连接器较少。
  • 没有池级配置。
  • 没有池级库管理。
  • 仅部分支持 mssparkutils

网络配置

若要将网络隔离与 Azure 机器学习和无服务器 Spark 计算配合使用,请使用托管虚拟网络

非活动时间和拆解机制

无服务器 Spark 计算(冷启动)资源在首次启动时可能需要三到五分钟才能启动 Spark 会话本身。 预配由 Azure Synapse 支持的自动无服务器 Spark 计算资源会导致这种延迟。 预配无服务器 Spark 计算并启动 Apache Spark 会话后,后续代码执行(热启动)不会出现此延迟。

Spark 会话配置提供了一个定义会话超时(以分钟为单位)的选项。 当非活动时间超过用户定义的超时时间后,Spark 会话将终止。 如果在接下来的 10 分钟内没有启动另一个 Spark 会话,则为无服务器 Spark 计算预配的资源会被拆解。

无服务器 Spark 计算资源拆解后,需要冷启动才能提交下一个作业。 下一个可视化效果显示了一些会话非活动时段和群集拆解方案。

可展开的图,其中显示 Apache Spark 会话非活动时间和群集拆解的方案。

会话级 Conda 包

Conda 依赖项 YAML 文件可以在会话配置中定义许多会话级 Conda 包。 如果会话需要 15 分钟以上才能安装 YAML 文件中定义的 Conda 包,会话将超时。 首先检查所需的包是否已在 Azure Synapse 基础映像中可用,这一点非常重要。 为此,用户应访问这些资源以确定所使用的 Apache Spark 版本的基础映像中可用的包

重要

适用于 Apache Spark 的 Azure Synapse 运行时:公告

  • 适用于 Apache Spark 3.2 的 Azure Synapse 运行时:
    • EOLA 公告日期:2023 年 7 月 8 日
    • 支持结束日期:2024 年 7 月 8 日。 在此日期之后,将会禁用运行时。
  • 为了获取持续支持和最佳性能,建议迁移到 Apache Sark 3.4

注意

对于会话级 Conda 包:

  • 冷启动大约需要十到十五分钟。
  • 使用同一 Conda 包的暖启动大约需要一分钟。
  • 使用不同 Conda 包的暖启动还需要大约十到十五分钟。
  • 如果安装的包很大或需要较长的安装时间,则可能会影响 Spark 实例启动时间。
  • 不支持更改 PySpark、Python、Scala/Java、.NET 或 Spark 版本。
  • 不支持 Docker 映像。

使用会话级 Conda 包时改进会话冷启动时间

可以通过将 spark.hadoop.aml.enable_cache 配置变量设置为 true,可以改进 Spark 会话冷启动时间。 使用会话级 Conda 包的会话冷启动在会话首次启动时通常需要 10 到 15 分钟。 但是,后续会话冷启动需要三到五分钟。 在配置会话用户界面中的配置设置下定义配置变量。

显示启用缓存的 Spark 会话配置标记的可展开示意图。

附加的 Synapse Spark 池

在 Azure Synapse 工作区中创建的 Spark 池在包含附加 Synapse Spark 池的 Azure 机器学习工作区中变得可用。 此选项可能适用于想要重用现有 Synapse Spark 池的用户。

将 Synapse Spark 池附加到 Azure 机器学习工作区需要执行更多步骤,然后才能在 Azure 机器学习中将该池用于以下目的:

附加的 Synapse Spark 池提供对原生 Azure Synapse 功能的访问权限。 用户负责预配、附加、配置和管理 Synapse Spark 池。

附加的 Synapse Spark 池的 Spark 会话配置还提供了一个选项来定义会话超时(以分钟为单位)。 会话超时行为类似于上一部分中的说明,只不过在会话超时后永远不会拆解关联的资源。

定义 Spark 群集大小

在 Azure 机器学习 Spark 作业中,可以使用三个参数值定义 Spark 群集大小:

  • 执行程序数
  • 执行程序核心数
  • 执行程序内存

应将 Azure 机器学习 Apache Spark 执行程序看作是 Azure Spark 工作器节点的等效项。 可以通过一个示例来解释这些参数。 假设将执行程序数定义为 6(相当于 6 个工作器节点)、执行程序核心数定义为 4,执行程序内存定义为 28 GB。 然后,Spark 作业可以访问总共 24 个核心的群集以及 168 GB 内存。

确保 Spark 作业的资源访问

若要访问数据和其他资源,Spark 作业可以使用托管标识或用户标识直通。 下表总结了 Spark 作业用来访问资源的机制。

Spark 池 支持的标识 默认标识
无服务器 Spark 计算 用户标识,附加到工作区的用户分配的托管标识 用户标识
附加的 Synapse Spark 池 用户标识,附加到所附加的 Synapse Spark 池的用户分配的托管标识,所附加的 Synapse Spark 池的系统分配的托管标识 所附加的 Synapse Spark 池的系统分配的托管标识

此文介绍 Spark 作业的资源访问。 在笔记本会话中,无服务器 Spark 计算和附加的 Synapse Spark 池在交互式数据整理期间依赖于用户标识直通进行数据访问。

注意

  • 为确保成功执行 Spark 作业,请将(用于数据输入和输出的 Azure 存储帐户上的)“参与者”和“存储 Blob 数据参与者”角色分配给将用于 Spark 作业提交的标识。
  • 如果附加的 Synapse Spark 池指向关联了托管虚拟网络的 Azure Synapse 工作区中的 Synapse Spark 池,则配置存储帐户的托管专用终结点。 此配置将有助于确保数据访问正常进行。

后续步骤