在 Azure 虚拟网络中部署 Azure Databricks(VNet 注入)
本文介绍如何在你自己的 Azure 虚拟网络中部署 Azure Databricks 工作区(也称为 VNet 注入)。
通过 VNet 注入进行网络自定义
Azure Databricks 的默认部署是 Azure 上的完全托管的服务。 Azure 虚拟网络 (VNet) 部署到已锁定的资源组。 所有经典计算平面资源都与该 VNet 相关联。 如果需要网络自定义,你可以在自己的虚拟网络中部署 Azure Databricks 经典计算平面资源。 这样,便可以:
- 使用服务终结点或 Azure 专用终结点以更安全的方式将 Azure Databricks 连接到其他 Azure 服务(如 Azure 存储)。
- 使用用户定义的路由连接到本地数据源。 请参阅用户定义的 Azure Databricks 路由设置。
- 将 Azure Databricks 连接到网络虚拟设备以检查所有出站流量并根据允许和拒绝规则执行操作。 请参阅选项:使用虚拟设备或防火墙路由 Azure Databricks 流量
- 将 Azure Databricks 配置为使用自定义 DNS。 请参阅选项:配置自定义 DNS。
- 配置网络安全组 (NSG) 规则以指定出口流量限制。
通过将 Azure Databricks 经典计算平面资源部署到你自己的 VNet,还可以利用灵活的 CIDR 范围。 对于 VNet,你可以使用 CIDR 范围大小 /16
-/24
。 对于子网,可使用小至 /26
的 IP 范围。
重要
不能替换现有工作区的 VNet。 如果当前工作区无法容纳所需数量的活动群集节点,我们建议在较大的 VNet 中另外创建一个工作区。 按照这些详细的迁移步骤将资源(笔记本、群集配置、作业)从旧工作区复制到新工作区。
虚拟网络要求
要将 Azure Databricks 工作区部署到的 VNet 必须满足以下要求:
- 区域:VNet 必须位于 Azure Databricks 工作区所在的同一区域和订阅中。
- 订阅: 该 VNet 必须与 Azure Databricks 工作区属于同一订阅。
- 地址空间:VNet 的 CIDR 块范围为从 到
/24
,两个子网(容器子网和主机子网)的 CIDR 块最大可以为/26
。 若要查看有关基于 VNet 及其子网的大小的最大群集节点数的指导,请参阅地址空间和最大群集节点数。 - 子网: VNet 必须包括两个专用于 Azure Databricks 工作区的子网:一个容器子网(有时称为专用子网)和一个主机子网(有时称为公共子网)。 使用安全群集连接部署工作区时,容器子网和主机子网都使用专用 IP。 不能跨工作区共享子网或在 Azure Databricks 工作区使用的子网上部署其他 Azure 资源。 若要查看有关基于 VNet 及其子网的大小的最大群集节点数的指导,请参阅地址空间和最大群集节点数。
地址空间和最大群集节点数
具有较小虚拟网络的工作区比具有较大虚拟网络的工作区会更快地用完 IP 地址(网络空间)。 可使用的 VNet 的 CIDR 块范围为 /16
到 /24
,两个子网(容器子网和主机子网)的 CIDR 块最大可以为 /26
。 你可以针对子网创建最大 /28
的 CIDR 块,但 Databricks 不建议使用小于 /26
的子网。
VNet 地址空间的 CIDR 范围会影响工作区可以使用的群集节点的最大数目。
Azure Databricks 工作区需要 VNet 中的两个子网:容器子网和主机子网。 Azure 在每个子网中预留 5 个 IP。 Azure Databricks 要求为每个群集节点提供两个 IP:为主机子网中的主机提供一个 IP 地址,为容器子网中的容器提供一个 IP 地址。
- 你可能不希望使用 VNet 的所有地址空间。 例如,你可能想要在一个 VNet 中创建多个工作区。 由于不能跨工作区共享子网,因此你可能希望子网不要用完 VNet 的地址空间。
- 必须为 VNet 地址空间中的两个新子网分配地址空间,并且这个分配的地址空间不得与该 VNet 中当前子网或未来子网的地址空间重叠。
下表显示了基于网络大小的最大子网大小。 此表假定不存在占用地址空间的其他子网。 如果你有预先存在的子网或要为其他子网预留地址空间,请使用较小的子网:
VNet 地址空间 (CIDR) | 最大 Azure Databricks 子网大小 (CIDR),假定没有其他子网 |
---|---|
/16 |
/17 |
/17 |
/18 |
/18 |
/19 |
/20 |
/21 |
/21 |
/22 |
/22 |
/23 |
/23 |
/24 |
/24 |
/25 |
若要根据子网大小查找最大群集节点数,请使用下表。 “每个子网的 IP 地址数”列包含 Azure 预留的 5 个 IP 地址。 最右边的列表示可以同时在已预配了该大小的子网的工作区中运行的群集节点的数目。
子网大小 (CIDR) | 每个子网的 IP 地址数 | 最大 Azure Databricks 群集节点数 |
---|---|---|
/17 |
32768 | 32763 |
/18 |
16384 | 16379 |
/19 |
8192 | 8187 |
/20 |
4096 | 4091 |
/21 |
2048 | 2043 |
/22 |
1024 | 1019 |
/23 |
512 | 507 |
/24 |
256 | 251 |
/25 |
128 | 123 |
/26 |
64 | 59 |
使用安全群集连接时的出口 IP 地址
如果在使用 VNet 注入的工作区上启用安全群集连接,Databricks 建议工作区具有稳定的出口公共 IP。
稳定的出口公共 IP 地址非常有用,因为你可以将它们添加到外部允许列表。 例如,若要使用稳定的传出 IP 地址从 Azure Databricks 连接到 Salesforce。 如果你配置 IP 访问列表,则必须将这些公共 IP 地址添加到允许列表中。 请参阅配置工作区的 IP 访问列表。
警告
Microsoft 宣布,2025 年 9 月 30 日,Azure 中虚拟机的默认出站访问连接将停用。 请参阅此公告。 这意味着,使用默认出站访问而不是稳定出口公共 IP 的 Azure Databricks 工作区可能无法在该日期之后继续工作。 Databricks 建议在该日期之前为工作区添加显式出站方法。
若要配置稳定的出口公共 IP,请参阅通过 VNet 注入进行传出通信
共享资源和对等互连
如果需要 DNS 等共享网络资源,Databricks 强烈建议遵循中心辐射型模型的 Azure 最佳做法。 使用 VNet 对等互连将工作区 VNet 的专用 IP 空间扩展到中心,同时使分支彼此隔离。
如果 VNet 中有其他资源,或者使用对等互连,Databricks 强烈建议将拒绝规则添加到网络安全组 (NSG),其中这些网络安全组附加到同一 VNet 中或与该 VNet 对等互连的其他网络和子网。 为入站和出站连接添加到连接拒绝规则,以便限制到 Azure Databricks 计算资源和来自这些资源的连接。 如果群集需要访问网络上的资源,请添加规则以仅允许满足要求所需的最小访问权限。
相关信息,请参阅网络安全组规则。
使用 Azure 门户创建 Azure Databricks 工作区
此部分介绍如何在 Azure 门户中创建 Azure Databricks 工作区并将其部署到你现有的 VNet 中。 Azure Databricks 会根据指定的 CIDR 范围,使用两个新的子网(如果尚不存在)来更新 VNet。 该服务还使用新的网络安全组来更新子网,配置入站和出站规则,最后将工作区部署到已更新的 VNet。 如果想要更好地控制 VNet 的配置,请使用 Azure Databricks 提供的 Azure 资源管理器 (ARM) 模板,而不要使用门户。 例如,使用现有的网络安全组或创建你自己的安全规则。 请参阅使用 Azure 资源管理器模板的高级配置。
必须为创建工作区的用户分配相应虚拟网络的“网络参与者”角色,或分配自定义角色(已为其分配 Microsoft.Network/virtualNetworks/subnets/join/action
和 Microsoft.Network/virtualNetworks/subnets/write
权限)。
必须配置一个 VNet,以便将 Azure Databricks 工作区部署到其中。 可以使用现有的 VNet,也可以创建新的 VNet,但此 VNet 必须与你计划创建的 Azure Databricks 工作区位于同一区域和订阅中。 设置 VNet 大小时,CIDR 范围必须为 /16 到 /24。 有关详细信息,请参阅虚拟网络要求。
配置工作区时,请使用现有子网,或者使用新子网,但需指定名称和 IP 范围。
在 Azure 门户中,选择“+ 创建资源”“分析”>“Azure Databricks”或搜索 Azure Databricks,然后单击“创建”或“+ 添加”以启动“Azure Databricks 服务”对话框。
按照在你自己的 VNet 中创建 Azure Databricks 工作区快速入门中所述的配置步骤操作。
在“网络”选项卡中,选择要在“虚拟网络”字段中使用的 VNet。
重要
如果未在选取器中看到网络名称,请确认为工作区指定的 Azure 区域是否与所需 VNet 的 Azure 区域匹配。
为子网命名,并在其大小最大为
/26
的块中提供 CIDR 范围。 若要查看有关基于 VNet 及其子网的大小的最大群集节点数的指导,请参阅地址空间和最大群集节点数。 部署工作区后,无法更改子网 CIDR 范围。- 若要指定现有子网,请指定现有子网的确切名称。 使用现有子网时,还应将工作区创建表单中的 IP 范围设置为与现有子网的 IP 范围完全匹配。
- 若要创建新子网,请指定该 VNet 中尚不存在的子网名称。 将创建具有指定 IP 范围的子网。 你必须指定在 VNet 的 IP 范围内的 IP 范围,不得指定已分配给现有子网的 IP 范围。
Azure Databricks 要求子网名称不超过 80 个字符。
子网会获得关联的网络安全组规则,这些规则包括允许群集内部通信的规则。 Azure Databricks 拥有通过
Microsoft.Databricks/workspaces
资源提供程序更新两个子网的委托权限。 这些权限仅适用于 Azure Databricks 所需的网络安全组规则,而不适用于你添加的其他网络安全组规则或所有网络安全组中所包含的默认网络安全组规则。单击“创建”,以将 Azure Databricks 工作区部署到 VNet。
使用 Azure 资源管理器模板的高级配置
如果想要更多地控制对 VNet 的配置,请使用以下 Azure 资源管理器 (ARM) 模板,而不要使用基于门户 UI 的自动 VNet 配置和工作区部署。 例如,使用现有的子网、现有的网络安全组,或添加你自己的安全规则。
如果使用自定义 Azure 资源管理器模板或用于 Azure Databricks VNet 注入的工作区模板将工作区部署到现有 VNet,则必须创建主机子网和容器子网,将网络安全组附加到每个子网,并在部署工作区之前将子网委托给 Microsoft.Databricks/workspaces
资源提供程序。 部署的每个工作区必须拥有一对单独的子网。
全功能模板
若要使用一个模板来创建 VNet 和 Azure Databricks 工作区,请使用适用于 Azure Databricks VNet 注入工作区的全功能模板。
虚拟网络模板
若要使用一个模板来创建具有适当子网的 VNet,请使用适用于 Databricks VNet 注入的 VNet 模板。
Azure Databricks 工作区模板
若要使用一个模板将 Azure Databricks 工作区部署到现有的 VNet,请使用适用于 Azure Databricks VNet 注入的工作区模板。
使用工作区模板可以指定现有的 VNet 并使用现有的子网:
- 部署的每个工作区必须拥有一对单独的主机/容器子网。 不支持跨工作区共享子网或在 Azure Databricks 工作区使用的子网上部署其他 Azure 资源。
- 在使用此 Azure 资源管理器模板部署工作区之前,VNet 的主机子网和容器子网必须附加网络安全组,并且必须将其委托给
Microsoft.Databricks/workspaces
服务。 - 若要创建其子网已进行适当委托的 VNet,请使用适用于 Databricks VNet 注入的 VNet 模板。
- 若要在尚未委托主机子网和容器子网的情况下使用现有的 VNet,请参阅添加或删除子网委托。
网络安全组规则
下表显示了 Azure Databricks 使用的最新网络安全组规则。 如果 Azure Databricks 需要添加规则或更改此列表中现有规则的范围,你将收到预先通知。 每当发生此类修改时,本文和各表都会更新。
Azure Databricks 如何管理网络安全组规则
下面各部分列出的 NSG 规则表示 Azure Databricks 通过将 VNet 的主机子网和容器子网委托给 Microsoft.Databricks/workspaces
服务,在 NSG 中自动预配和管理的规则。 你无权更新或删除这些 NSG 规则,尝试执行此类操作将被子网委托阻止。 Azure Databricks 必须拥有这些规则才能确保 Microsoft 能够在 VNet 中可靠地运行和支持 Azure Databricks 服务。
其中一些 NSG 规则将 VirtualNetwork 指定为源和目标。 在 Azure 中缺少子网级服务标记的情况下,这样做可以简化设计。 所有群集都在内部受到第二层网络策略的保护,这样群集 A 就无法连接到同一工作区中的群集 B。 如果工作区部署到同一个由客户管理的 VNet 中的一对不同的子网中,则这也适用于多个工作区。
重要
Databricks 强烈建议将拒绝规则添加到网络安全组 (NSG),其中这些网络安全组附加到同一 VNet 中或与该 VNet 对等互连的其他网络和子网。 为入站和出站连接添加到连接拒绝规则,以便限制到 Azure Databricks 计算资源和来自这些资源的连接。 如果群集需要访问网络上的资源,请添加规则以仅允许满足要求所需的最小访问权限。
工作区的网络安全组规则
本部分中的信息仅适用于在 2020 年 1 月 13 日之后创建的 Azure Databricks 工作区。 如果工作区是在 2020 年 1 月 13 日发布安全群集连接 (SCC) 之前创建的,请参阅下一部分。
此表列出了工作区的网络安全组规则,其中包含两个入站安全组规则,仅当禁用了安全群集连接 (SCC) 时才会包含这些规则。
方向 | 协议 | 源 | Source Port | 目标 | Dest Port | 已使用 |
---|---|---|---|---|---|---|
入站 | 任意 | VirtualNetwork | 任意 | VirtualNetwork | 任意 | 默认 |
入站 | TCP | AzureDatabricks(服务标记) 仅当 SCC 已禁用 |
任意 | VirtualNetwork | 22 | 公共 IP |
入站 | TCP | AzureDatabricks(服务标记) 仅当 SCC 已禁用 |
任意 | VirtualNetwork | 5557 | 公共 IP |
出站 | TCP | VirtualNetwork | 任意 | AzureDatabricks(服务标记) | 443, 3306, 8443-8451 | 默认 |
出站 | TCP | VirtualNetwork | 任意 | SQL | 3306 | 默认 |
出站 | TCP | VirtualNetwork | 任意 | 存储 | 443 | 默认 |
出站 | 任意 | VirtualNetwork | 任意 | VirtualNetwork | 任意 | 默认 |
出站 | TCP | VirtualNetwork | 任意 | EventHub | 9093 | 默认 |
注意
如果限制出站规则,Databricks 建议打开端口 111 和 2049 来启用某些库安装。
重要
Azure Databricks 是部署在全局 Azure 公有云基础结构上的 Microsoft Azure 第一方服务。 服务组件之间的所有通信(包括控制平面和客户计算平面中的公共 IP 之间的通信)都留在 Microsoft Azure 网络主干内进行。 另请参阅 Microsoft 全球网络。
故障排除
工作区创建错误
子网<subnet-id>
需要以下任意委托 [Microsoft.Databricks/workspaces] 来引用服务关联链接
可能的原因:创建工作区时所在的 VNet 的主机子网和容器子网尚未委托给 Microsoft.Databricks/workspaces
服务。 每个子网必须附加并正确委托网络安全组。 有关详细信息,请参阅虚拟网络要求。
子网<subnet-id>
已被工作区<workspace-id>
占用
可能的原因:创建工作区时所在的 VNet 的主机子网和容器子网已经被现有 Azure Databricks 工作区占用。 不能在单个子网中共享多个工作区。 部署的每个工作区必须拥有一对新的主机子网和容器子网。
故障排除
实例不可访问:无法通过 SSH 访问资源。
可能的原因:阻止了从控制平面到辅助角色的流量。 如果要部署到已连接到本地网络的现有 VNet,请根据将 Azure Databricks 工作区连接到本地网络中提供的信息检查安装情况。
意外的启动失败:设置群集时遇到意外错误。 请重试,如果问题仍然存在,请联系 Azure Databricks。 内部错误消息:Timeout while placing node
。
可能的原因:从辅助角色到 Azure 存储终结点的流量被阻止。 如果使用自定义 DNS 服务器,请同时检查 VNet 中 DNS 服务器的状态。
云提供程序启动失败:在设置群集时遇到云提供程序错误。 请参阅 Azure Databricks 指南以获取详细信息。 Azure 错误代码:AuthorizationFailed/InvalidResourceReference.
可能的原因:VNet 或子网不再存在。 请确保 VNet 和子网存在。
群集已终止。 原因:Spark 启动失败:Spark 未能及时启动。 此问题可能是由 Hive 元存储发生故障、Spark 配置无效或初始化脚本出现故障而导致的。 请参阅 Spark 驱动程序日志来排查此问题,如果问题仍然存在,请联系 Databricks。 内部错误消息:Spark failed to start: Driver failed to start in time
。
可能的原因:容器无法与宿主实例或工作区存储帐户通信。 解决方法是为工作区存储帐户添加指向子网的自定义路由,并将下一个跃点设为 Internet。