Azure Synapse Analytics 中的 Apache Spark 的核心概念

Apache Spark 是并行处理框架,支持使用内存中处理来提升大数据分析应用程序的性能。 Azure Synapse Analytics 中的 Apache Spark 是 Apache Spark 在云中的一种 Azure 实现。

使用 Azure Synapse 可在 Azure 中轻松创建和配置 Spark 功能。 Azure Synapse 提供本文档所述的这些 Spark 功能的不同实现。

Spark 池

无服务器 Apache Spark 池在 Azure 门户中创建。 Spark 池的定义是,在实例化后,该池可用于创建一个 Spark 实例来处理数据。 Spark 池在创建后只作为元数据存在,不会消耗、运行资源,也不会产生资源费用。 Spark 池具有一系列控制 Spark 实例特征的属性。 这些特征包括但不限于名称、大小、缩放行为、生存时间。

由于创建 Spark 池不会产生相关的费用或资源成本,因此可以使用任意数目的不同配置创建任意数目的 Spark 池。 还可以将权限应用到 Spark 池,使用户只能访问某些池。

最佳做法是先创建较小的 Spark 池进行开发和调试,然后再创建较大的 Spark 池来运行生产工作负载。

可在 Azure Synapse Analytics 中的 Spark 池入门中了解如何创建 Spark 池及查看其所有属性

Spark 实例

Spark 实例在你连接到 Spark 池、创建会话和运行作业时创建。 由于可能有多个用户有权访问单个 Spark 池,因此将为连接的每个用户创建一个新的 Spark 实例。

提交第二个作业时,如果池中有容量,则现有的 Spark 实例也有容量。 然后,现有实例将处理该作业。 否则,如果容量在池级别可用,则将新建一个 Spark 实例。

实例的计费从 Azure VM 启动时开始。 Spark 池实例的计费将在池实例更改为终止时停止。 若要详细了解如何启动和解除分配 Azure VM,请参阅 Azure 虚拟机的状态和计费状态

示例

示例 1

  • 你创建名为 SP1 的 Spark 池;其固定群集大小为 20 个中等节点
  • 你提交使用 10 个节点的笔记本作业 J1,此时系统会创建 Spark 实例 SI1 来处理该作业
  • 然后,你提交使用 10 个节点的另一个作业 J2(因为池和实例中仍有容量),J2 将由 SI1 处理
  • 如果 J2 请求 11 个节点,SP1 或 SI1 中就不会再有容量。 在这种情况下,如果 J2 来自笔记本,则会拒绝该作业;如果 J2 来自批处理作业,则会将其排队。
  • 计费从提交笔记本作业 J1 时开始。
    • Spark 池实例化了 20 个中等节点,每个节点有 8 个 vCore,通常需要大约 3 分钟才能启动。 20 x 8 = 160 个 vCore。
    • 根据确切的 Spark 池启动时间、空闲超时和两个笔记本作业的运行时,池可能会运行 18 到 20 分钟(Spark 池实例化时间 + 笔记本作业运行时 + 空闲超时)。
    • 假设运行时为 20 分钟,160 x 0.3 小时 = 48 vCore 小时。
    • 注意:vCore 小时数按秒计费,vCore 定价因 Azure 地区而异。 有关详细信息,请参阅 Azure Synapse 定价

示例 2

  • 你创建名为 SP2 的 Spark 池;该池启用了自动扩缩,且具有最少 10 个、最多 20 个中等节点
  • 你提交使用 10 个节点的笔记本作业 J1,此时系统会创建 Spark 实例 SI1 来处理该作业
  • 然后,你提交使用 10 个节点的另一个作业 J2(因为池中仍有容量),此时实例会自动扩展到 20 个节点并处理 J2。
  • 计费从提交笔记本作业 J1 时开始。
    • Spark 池实例化了 10 个中等节点,每个节点有 8 个 vCore,通常需要大约 3 分钟才能启动。 10 x 8,即 80 个 vCore。
    • 提交 J2 时,池通过添加另外 10 个中等节点自动扩展,并且通常需要 4 分钟才能完成自动扩展。 添加 10 x 8,即 80 个 vCore,总共达到 160 个 vCore。
    • 根据 Spark 池启动时间、第一个笔记本作业 J1 的运行时、扩展池的时间、第二个笔记本的运行时以及最后的空闲超时,池的运行时间可能介于 22 到 24 分钟之间(Spark 池实例化时间 + J1 笔记本作业运行时,总共为 80 个 vCore)+(Spark 池自动扩展时间 + J2 笔记本作业运行时 + 空闲超时,总共为 160 个 vCore)。
    • 80 个 vCore(每个 4 分钟)+ 160 个 vCore(每个 20 分钟) = 58.67 vCore 小时。
    • 注意:vCore 小时数按秒计费,vCore 定价因 Azure 地区而异。 有关详细信息,请参阅 Azure Synapse 定价

示例 3

  • 创建名为 SP1 的 Spark 池;其固定群集大小为 20 个节点。
  • 你提交使用 10 个节点的笔记本作业 J1,此时系统会创建 Spark 实例 SI1 来处理该作业。
  • 另一个用户 U2 提交使用 10 个节点的作业 J3,此时系统会创建新的 Spark 实例 SI2 来处理该作业。
  • 然后,你提交使用 10 个节点的另一个作业 J2,因为池和实例中仍有容量,J2 将由 SI1 处理。
  • 计费从提交笔记本作业 J1 时开始。
    • Spark 池 SI1 实例化了 20 个中等节点,每个节点有 8 个 vCore,通常需要大约 3 分钟才能启动。 20 x 8,即 160 个 vCore。
    • 根据确切的 Spark 池启动时间、空闲超时以及第一个和第三个笔记本作业的运行时,SI1 池可能会运行 18 到 20 分钟(Spark 池实例化时间 + 笔记本作业运行时 + 空闲超时)。
    • 另一个 Spark 池 SI2 实例化了 20 个中等节点,每个节点有 8 个 vCore,通常需要大约 3 分钟才能启动。 20 x 8,即 160 个 vCore
    • 根据确切的 Spark 池启动时间、空闲超时以及第一个笔记本作业的运行时,SI2 池可能会运行 18 到 20 分钟(Spark 池实例化时间 + 笔记本作业运行时 + 空闲超时)。
    • 假设两个池各运行 20 分钟,则 160 x 0.3 x 2 = 96 vCore 小时。
    • 注意:vCore 小时数按秒计费,vCore 定价因 Azure 地区而异。 有关详细信息,请参阅 Azure Synapse 定价

Apache Spark for Azure Synapse 中的配额和资源约束

工作区级别

每个 Azure Synapse 工作区都附带了可用于 Spark 的 vCore 默认配额。 该配额拆分为用户配额和数据流配额,因此两种使用模式都只在工作区中使用部分 vCore。 配额有所差别,具体取决于订阅的类型,但在用户和数据流之间对称。 然而,如果请求的 vCore 数超出工作区中剩余的数量,将会收到以下错误:

Failed to start session: [User] MAXIMUM_WORKSPACE_CAPACITY_EXCEEDED
Your Spark job requested 480 vCores.
However, the workspace only has xxx vCores available out of quota of yyy vCores.
Try reducing the numbers of vCores requested or increasing your vCore quota. Click here for more information - https://go.microsoft.com/fwlink/?linkid=213499

消息中的链接指向本文。

Spark 池级别

定义 Spark 池时,可有效地为该池定义每位用户的配额;如果运行多个笔记本和/或作业,则可能会耗尽池配额。 如果你这样做,系统将会生成错误消息

Failed to start session: Your Spark job requested xx vCores.
However, the pool is consuming yy vCores out of available zz vCores.Try ending the running job(s) in the pool, reducing the numbers of vCores requested, increasing the pool maximum size or using another pool

若要解决此问题,你必须在运行笔记本或作业来提交新的资源请求之前,减少对池资源的使用量。

后续步骤