配置群集

本文介绍创建和编辑 Azure Databricks 群集时可用的配置选项。 它侧重于说明如何使用 UI 创建和编辑群集。 有关其他方法,请参阅群集 CLI群集 API

有关确定最适合你的需求的配置选项组合的帮助,请参阅群集配置最佳做法

创建群集

从机密中检索 Spark 配置属性

Databricks 建议在机密而不是纯文本中存储敏感信息(例如密码)。 若要在 Spark 配置中引用机密,请使用以下语法:

spark.<secret-prop-name> <path-value>

例如,将一个名为 password 的 Spark 配置属性设置为 secrets/apps/acme-app/password 中存储的机密值:

spark.password {{secrets/apps/acme-app/password}}

有关详细信息,请参阅 Spark 配置属性或环境变量中的机密路径

群集策略

群集策略基于一组规则限制配置群集的能力。 策略规则会限制可用于创建群集的属性或属性值。 群集策略的 ACL 可以将策略的使用限制到特定用户和组,因此可以限制你在创建群集时可选择的策略。

若要配置群集策略,请在“策略”下拉列表中选择群集策略。

选择群集策略

备注

如果尚未在工作区中创建任何策略,则不会显示“策略”下拉列表。

如果你有以下权限,则可执行相应的操作:

  • 如果有群集创建权限,则可选择“无限制”策略,并创建可以充分配置的群集。 “无限制”策略不限制任何群集属性或属性值。
  • 如果有群集创建权限和群集策略访问权限,则可选择“无限制”策略和你有权访问的策略。
  • 如果只有群集策略访问权限,则可选择你有权访问的策略。

群集模式

Azure Databricks 支持三种群集模式:标准、高并发和单节点。 默认群集模式为“标准”。

备注

群集配置包括自动终止设置,其默认值依赖于群集模式:

  • 默认情况下,标准群集和单节点群集在 120 分钟后自动终止。
  • 高并发群集不会自动终止。

重要

创建群集后,无法更改群集模式。 如果需要另一群集模式,必须创建新群集。

标准群集

建议将标准群集用于单个用户。 标准群集可以运行采用以下任何语言开发的工作负载:Python、SQL、R 和 Scala。

高并发群集

高并发群集是托管的云资源。 高并发群集的主要优点是,它们提供细粒度共享,可以最大限度地提高资源利用率并降低查询延迟。

高并发群集可以运行使用 SQL、Python 和 R 开发的工作负载。高并发群集的性能和安全性通过在单独的进程中运行用户代码来提供,这在 Scala 中是不可能的。

此外,只有高并发群集支持表访问控制

若要创建高并发群集,请将“群集模式”设置为“高并发” 。

高并发群集模式

有关如何使用群集 API 创建高并发群集的示例,请参阅高并发群集示例

单节点群集

单节点群集没有工作器,在驱动程序节点上运行 Spark 作业。 相比而言,标准模式群集除了需要用于执行 Spark 作业的驱动程序节点外,还需要至少一个 Spark 工作器节点。

若要创建单节点群集,请将“群集模式”设置为“单一节点” 。

单节点群集模式

若要详细了解如何使用单节点群集,请参阅单节点群集

pool

若要缩短群集启动时间,可以将群集附加到驱动程序和工作器节点的空闲实例的预定义。 群集是使用池中的实例创建的。 如果池中没有足够的空闲资源来创建请求的驱动程序节点或工作器节点,则池会通过从实例提供程序分配新实例进行扩展。 终止附加的群集后,它使用的实例会返回到池中,并可供其他群集重复使用。

如果为工作器节点(而不是驱动程序节点)选择池,则驱动程序节点会从工作器节点配置继承该池。

重要

如果尝试为驱动程序节点(而不是工作器节点)选择池,则会出现错误,并且不会创建群集。 此要求可防止出现驱动程序节点必须等待创建工作器节点的情况,反之亦然。

请参阅,详细了解如何在 Azure Databricks 中使用池。

Databricks Runtime

Databricks 运行时是在群集上运行的核心组件集。 所有 Databricks 运行时都包括 Apache Spark,都添加了可以提高可用性、性能和安全性的组件与更新。 有关详细信息,请参阅 Databricks 运行时

Azure Databricks 提供多种类型的运行时以及这些运行时类型的多个版本,这些版本会在你创建或编辑群集时出现在“Databricks 运行时版本”下拉列表中。

选择运行时版本

Docker 映像

对于某些 Databricks Runtime 版本,可以在创建群集时指定 Docker 映像。 示例用例包括库自定义、不会更改的黄金容器环境以及 Docker CI/CD 集成。

你还可以使用 Docker 映像在具有 GPU 设备的群集上创建自定义深度学习环境。

有关说明,请参阅使用 Databricks 容器服务自定义容器GPU 群集上的 Databricks 容器服务

Python 版本

重要

Python 2 的生命周期已于 2020 年 1 月 1 日结束。 Databricks Runtime 6.0 及更高版本不支持 Python 2。 Databricks Runtime 5.5 及更低版本继续支持 Python 2。

运行 Databricks Runtime 6.0 及更高版本的 Python 群集

Databricks Runtime 6.0(不受支持)及更高版本仅支持 Python 3。 若要了解与 Databricks Runtime 6.0 所引入的 Python 环境相关的重大变更,请参阅发行说明中的 Python 环境

运行 Databricks Runtime 5.5 LTS 的 Python 群集

对于 Databricks Runtime 5.5 LTS,Spark 作业、Python 笔记本单元和库安装都支持 Python 2 和 3。

使用 UI 创建的群集的默认 Python 版本为 Python 3。 在 Databricks Runtime 5.5 LTS 中,使用 REST API 创建的群集的默认版本为 Python 2。

指定 Python 版本

若要在使用 UI 创建群集时指定 Python 版本,请从“Python 版本”下拉列表中进行选择。

群集 Python 版本

若要在使用 API 创建群集时指定 Python 版本,请将环境变量 PYSPARK_PYTHON 设置为 /databricks/python/bin/python/databricks/python3/bin/python3。 有关示例,请参阅将大型文件上传到 DBFS 的 REST API 示例。

若要验证 PYSPARK_PYTHON 配置是否已生效,请在 Python 笔记本(或 %python 单元)中运行以下语句:

import sys
print(sys.version)

如果指定了 /databricks/python3/bin/python3,其输出应如下所示:

3.5.2 (default, Sep 10 2016, 08:21:44)
[GCC 5.4.0 20160609]

重要

对于 Databricks Runtime 5.5 LTS,当你在笔记本中运行 %sh python --version 时,python 指的是 Ubuntu 系统 Python 版本,即 Python 2。 使用 /databricks/python/bin/python 来指示 Databricks 笔记本和 Spark 使用的 Python 版本:此路径会自动配置为指向正确的 Python 可执行文件。

常见问题 (FAQ)

是否可以在同一群集上同时使用 Python 2 和 Python 3 笔记本?

否。 Python 版本是群集范围的设置,不能在每个笔记本上进行配置。

Python 群集上安装了哪些库?

若要详细了解已安装的特定库,请参阅 Databricks 运行时发行说明

现有的 PyPI 库是否适用于 Python 3?

这取决于库的版本是否支持 Python 3 版的 Databricks Runtime 版本。

Databricks Runtime 5.5 LTS 使用 Python 3.5。 Databricks Runtime 6.0 及更高版本和带有 Conda 的 Databricks Runtime 使用 Python 3.7。 特定的旧版 Python 库可能无法与 Python 3.7 前向兼容。 对于这种情况,你需要使用较新版的库。

现有的 .egg 库是否适用于 Python 3?

这取决于现有的 egg 库是否与 Python 2 和 3 交叉兼容。 如果该库不支持 Python 3,则库附件会出故障,或者会出现运行时错误。

若要全面了解如何将代码移植到 Python 3 以及如何编写与 Python 2 和 3 兼容的代码,请参阅支持 Python 3

是否仍可使用初始化脚本安装 Python 库?

群集节点初始化脚本的一个常见用例是安装包。

对于 Databricks Runtime 5.5 LTS,请使用 /databricks/python/bin/pip 来确保 Python 包安装到 Databricks Python 虚拟环境中,而不是系统 Python 环境中。

对于 Databricks Runtime 6.0 及更高版本和带有 Conda 的 Databricks Runtime,pip 命令是指正确的 Python 虚拟环境中的 pip。 但是,如果使用初始化脚本来创建 Python 虚拟环境,请始终使用绝对路径来访问 pythonpip

群集节点类型

群集由一个驱动程序节点和零个或多个工作器节点组成。

你可以为驱动程序节点和工作器节点分别选取不同的云提供程序实例类型,虽然默认情况下驱动程序节点使用与工作器节点相同的实例类型。 不同的实例类型系列适用于不同的用例,例如内存密集型工作负荷或计算密集型工作负荷。

备注

如果安全要求包括计算隔离,请选择一个 Standard_F72s_V2 实例作为工作器类型。 这些实例类型表示使用整个物理主机的隔离虚拟机,并提供为特定工作负荷(例如美国国防部影响级别 5 (IL5) 工作负荷)提供支持所需的隔离级别。

驱动程序节点

驱动程序节点保留附加到群集的所有笔记本的状态信息。 驱动程序节点还维护 SparkContext,并解释从笔记本或群集上的库中运行的所有命令,以及运行与 Spark 执行程序协调的 Apache Spark 主节点。

驱动程序节点类型的默认值与工作器节点类型相同。 如果计划使用 collect() 从 Spark 工作器处收集大量数据,并在笔记本中分析这些数据,则可以选择具有更多内存的更大驱动程序节点类型。

提示

由于驱动程序节点保留附加的笔记本的所有状态信息,因此,请务必将未使用的笔记本与驱动程序节点分离。

工作器节点

Azure Databricks 工作器节点运行 Spark 执行程序和正常运行群集所需的其他服务。 通过 Spark 分配工作负载时,所有分布式处理都在工作器节点上进行。 Azure Databricks 为每个工作器节点运行一个执行程序;因此,“执行程序”和“工作器”这两个术语可在 Azure Databricks 体系结构的上下文中互换使用。

提示

若要运行 Spark 作业,至少需要一个工作器节点。 如果群集没有工作器,可以在驱动程序节点上运行非 Spark 命令,但 Spark 命令会失败。

GPU 实例类型

对于在计算方面富有挑战性并且对性能要求很高的任务(例如与深度学习相关的任务),Azure Databricks 支持通过图形处理单元 (GPU) 进行加速的群集。 此支持为 Beta 版。 有关详细信息,请参阅支持 GPU 的群集

竞价实例

为了节省成本,可以通过选中“现成实例”复选框来选择使用现成实例(也称为 Azure 现成 VM)

配置竞价

第一个实例将始终为按需实例(驱动程序节点始终为按需),后续实例将为现成实例。 如果由于不可用而收回竞价实例,则部署按需实例来替换收回的实例。

群集大小和自动缩放

创建 Azure Databricks 群集时,可以为群集提供固定数目的工作器,也可以为群集提供最小数目和最大数目的工作器。

当你提供固定大小的群集时,Azure Databricks 确保你的群集具有指定数量的工作器。 当你为工作器数量提供了范围时,Databricks 会选择运行作业所需的适当数量的工作器。 这称为“自动缩放”。

使用自动缩放,Azure Databricks 可以根据作业特征动态地重新分配工作器。 在计算方面,管道的某些部分可能比其他部分的要求更高,Databricks 会自动在作业的这些阶段添加额外的工作器(并在不再需要它们时将其删除)。

通过自动缩放,可以更轻松地实现高群集利用率,因为无需通过预配群集来匹配工作负载。 这特别适用于其需求随时间变化的工作负荷(例如在一天的过程中浏览数据集),但也可能适用于预配要求未知的、时间较短的一次性工作负荷。 因此,自动缩放有两个优点:

  • 与大小恒定且未充分预配的群集相比,工作负荷的运行速度可以更快。
  • 与静态大小的群集相比,自动缩放群集可降低总体成本。

自动缩放可以提供这两个优点之一,也可以同时提供这两个优点,具体取决于群集和工作负荷的恒定大小。 当云服务提供商终止实例时,群集大小可能会小于所选工作器的最小数目。 在这种情况下,Azure Databricks 会通过连续重试来重新预配实例,以便保持最小数量的工作器。

备注

自动缩放不适用于 spark-submit 作业。

自动缩放类型

Azure Databricks 提供两种类型的群集节点自动缩放:标准和优化。 有关优化自动缩放优点的讨论,请参阅关于优化自动缩放的博客文章。

自动化(作业)群集始终使用优化自动缩放。 在全用途群集上执行的自动缩放的类型取决于工作区配置。

标准自动缩放由“标准”定价层的工作区中的全用途群集使用。 优化自动缩放由 Azure Databricks 高级计划中的全用途群集使用。

自动缩放的表现方式

自动缩放的表现取决于它是优化自动缩放还是标准自动缩放,以及是应用于全用途群集还是作业群集。

优化的自动缩放

  • 通过 2 个步骤从最小值纵向扩展到最大值。
  • 即使群集未处于空闲状态,也可以通过查看 shuffle 文件状态进行纵向缩减。
  • 按当前节点数的某个百分比进行纵向缩减。
  • 在作业群集上,如果在过去的 40 秒内群集未得到充分利用,则进行纵向缩减。
  • 在全用途群集上,如果在过去的 150 秒内群集未得到充分利用,则进行纵向缩减。
  • spark.databricks.aggressiveWindowDownS Spark 配置属性以秒为单位指定群集做出纵向缩减决策的频率。 增大此值会导致群集更缓慢地纵向缩减。 最大值为 600。

标准自动缩放

  • 从添加 8 个节点开始。 然后,以指数方式进行纵向扩展,但可能需要执行多个步骤才能达到最大值。你可以通过设置 spark.databricks.autoscaling.standardFirstStepUp Spark 配置属性来自定义第一步。
  • 仅当群集处于完全空闲状态且在过去 10 分钟内未得到充分利用时,才进行纵向缩减。
  • 从 1 个节点开始,以指数方式进行纵向缩减。

启用并配置自动缩放

若要允许 Azure Databricks 自动重设群集大小,请为群集启用自动缩放,并提供工作器数目的最小值和最大值范围。

  1. 启用自动缩放。

    • 全用途群集 - 在“创建群集”页的“Autopilot 选项”框中,选中“启用自动缩放”复选框:

      启用自动缩放

    • 作业群集 - 在“配置群集”页的“Autopilot 选项”框中,选择“启用自动缩放”复选框:

    启用自动缩放

  2. 配置最小和最大工作器数。

    配置最小和最大工作器数

    群集运行时,群集详细信息页将显示已分配的工作器数。 可以将分配的工作器数与工作器配置进行比较,并根据需要进行调整。

    重要

    如果使用实例池

    • 请确保请求的群集大小小于或等于池中空闲实例的最小数目。 如果它大于该数目,则群集启动时间相当于不使用池的群集的启动时间。
    • 请确保群集最大大小小于或等于池的最大容量。 如果它大于该容量,则无法创建群集。

自动缩放示例

如果将静态群集重新配置为自动缩放群集,Azure Databricks 会立即在最小值和最大值边界内重设群集的大小,然后开始自动缩放。 例如,下表展示了在将群集重新配置为在 5 到 10 个节点之间进行自动缩放时,具有特定初始大小的群集会发生什么情况。

初始大小 重新配置后的大小
6 6
12 10
3 5

自动缩放本地存储

通常,估算特定作业会占用的磁盘空间量十分困难。 为了让你不必估算在创建时要附加到群集的托管磁盘的 GB 数,Azure Databricks 会自动在所有 Azure Databricks 群集上启用自动缩放本地存储。

自动缩放本地存储时,Azure Databricks 会监视群集的 Spark 工作器上提供的可用磁盘空间量。 如果工作器开始出现磁盘空间严重不足的情况,则 Databricks 会在该工作器的磁盘空间耗尽之前自动将新的托管磁盘附加到该工作器。 附加磁盘时,每个虚拟机的总磁盘空间(包括虚拟机的初始本地存储)存在 5 TB 的限制。

仅当虚拟机返回到 Azure 时,才会拆离附加到虚拟机的托管磁盘。 也就是说,只要虚拟机属于某个正在运行的群集,就永远不会将托管磁盘从该虚拟机中拆离。 若要纵向缩减托管磁盘使用量,Azure Databricks 建议在配置了 GPU 实例类型自动终止的群集中使用此功能。

本地磁盘加密

重要

此功能目前以公共预览版提供。

用于运行群集的某些实例类型可能有本地附加的磁盘。 Azure Databricks 可以在这些本地附加的磁盘上存储 shuffle 数据或临时数据。 为了确保针对所有存储类型加密所有静态数据(包括在群集的本地磁盘上暂时存储的 shuffle 数据),可以启用本地磁盘加密。

重要

工作负荷的运行速度可能会更慢,因为在本地卷中读取和写入加密的数据会影响性能。

启用本地磁盘加密时,Azure Databricks 会在本地生成一个加密密钥,该密钥特定于每个群集节点,可以用来加密存储在本地磁盘上的所有数据。 此密钥的作用域是每个群集节点的本地,会与群集节点本身一起销毁。 在其生存期内,密钥驻留在内存中进行加密和解密,并以加密形式存储在磁盘上。

若要启用本地磁盘加密,必须使用群集 API。 在创建或编辑群集期间,请设置:

{
  "enable_local_disk_encryption": true
}

有关如何调用这些 API 的示例,请参阅群集 API 参考中的创建编辑

下面是一个启用本地磁盘加密的群集创建调用示例:

{
  "cluster_name": "my-cluster",
  "spark_version": "7.3.x-scala2.12",
  "node_type_id": "Standard_D3_v2",
  "enable_local_disk_encryption": true,
  "spark_conf": {
    "spark.speculation": true
  },
  "num_workers": 25
}

Spark 配置

若要微调 Spark 作业,可以在群集配置中提供自定义 Spark 配置属性

  1. 在群集配置页面上,单击“高级选项”切换开关。

  2. 单击“Spark”选项卡。

    Spark 配置

    在“Spark 配置”中,以每行一对键值对的形式输入配置属性。

使用群集 API 配置群集时,请在创建群集请求编辑群集请求spark_conf 字段中设置 Spark 属性。

若要为所有群集设置 Spark 属性,请创建一个全局初始化脚本

dbutils.fs.put("dbfs:/databricks/init/set_spark_params.sh","""
  |#!/bin/bash
  |
  |cat << 'EOF' > /databricks/driver/conf/00-custom-spark-driver-defaults.conf
  |[driver] {
  |  "spark.sql.sources.partitionOverwriteMode" = "DYNAMIC"
  |}
  |EOF
  """.stripMargin, true)

环境变量

可以设置你可从群集上运行的脚本访问的环境变量。

  1. 在群集配置页面上,单击“高级选项”切换开关。

  2. 单击“Spark”选项卡。

  3. 在“环境变量”字段中设置环境变量。

    “环境变量”字段

还可以使用创建群集请求编辑群集请求群集 API 终结点中的 spark_env_vars 字段来设置环境变量。

备注

在此字段中设置的环境变量在群集节点初始化脚本中不可用。 初始化脚本仅支持有限的一组预定义的初始化脚本执行顺序

群集标记

可以使用群集标记轻松地监视组织中各种组所使用的云资源的成本。 你可以在创建群集时将标记指定为键值对,Azure Databricks 会将这些标记应用于 VM 和磁盘卷等云资源以及 DBU 使用情况报告

对于从池启动的群集,自定义群集标记仅适用于 DBU 使用情况报告,不会传播到云资源。 若要详细了解池和群集标记类型如何协同工作,请参阅使用群集、池和工作区标记监视使用情况

为了方便起见,Azure Databricks 对每个群集应用四个默认标记:VendorCreatorClusterNameClusterId

此外,在作业群集上,Azure Databricks 应用两个默认标记:RunNameJobId。 在 Databricks SQL 使用的资源上,Azure Databricks 还应用默认标记 SqlEndpointId

警告

请勿向群集分配带有键 Name 的自定义标记。 每个群集都有一个标记 Name,其值由 Azure Databricks 设置。 如果更改与键 Name 关联的值,则 Azure Databricks 不会再跟踪该群集。 因此,群集可能不会在变为空闲后终止,并且将继续产生使用成本。

你可以在创建群集时添加自定义标记。 若要配置群集标记,请执行以下步骤:

  1. 在群集配置页面上,单击“高级选项”切换开关。

  2. 在页面底部,单击“标记”选项卡。

    “标记”选项卡

  3. 为每个自定义标记添加一个键值对。 最多可以添加 43 个自定义标记。

通过 SSH 访问群集

出于安全原因,Azure Databricks 中的 SSH 端口默认处于关闭状态。 若要允许通过 SSH 对 Spark 群集进行访问,请与 Azure Databricks 支持部门联系。

备注

仅当你的工作区部署在你自己的 Azure 虚拟网络中时,才能启用 SSH。

群集日志传送

创建群集时,可以指定一个位置来为 Spark 驱动程序节点、工作器节点和事件传送日志。 日志每隔五分钟会传送到所选目标一次。 当群集被终止时,Azure Databricks 会确保传送在群集终止之前生成的所有日志。

日志的目标取决于群集 ID。 如果指定的目标为 dbfs:/cluster-log-delivery,则 0630-191345-leap375 的群集日志会传送到 dbfs:/cluster-log-delivery/0630-191345-leap375

若要配置日志传送位置,请执行以下步骤:

  1. 在群集配置页面上,单击“高级选项”切换开关。

  2. 单击“日志记录”选项卡。

    群集日志传送

  3. 选择目标类型。

  4. 输入群集日志路径。

备注

此功能在 REST API 中也可用。 请参阅群集 API群集日志传送示例

初始化脚本

群集节点初始化脚本是一个 shell 脚本,它会在每个群集节点启动期间 Spark 驱动程序或工作器 JVM 启动之前运行。 你可以使用初始化脚本安装未包括在 Databricks 运行时中的包和库、修改 JVM 系统类路径、设置 JVM 所使用的系统属性和环境变量、修改 Spark 配置参数,或者完成其他配置任务。

可以将初始化脚本附加到群集,方法是:展开“高级选项”部分,然后单击“初始化脚本”选项卡。

有关详细说明,请参阅群集节点初始化脚本