在 Azure Databricks 上装载云对象存储

Azure Databricks 使用户能够将云对象存储装载到 Databricks 文件系统 (DBFS),以简化不熟悉云概念的用户的数据访问模式。 装载的数据不适用于 Unity Catalog,Databricks 建议不要使用挂载迁移,而是使用 Unity Catalog 管理数据治理。

Azure Databricks 如何装载云对象存储?

Azure Databricks 装载在工作区和云对象存储之间创建一个链接,这使你能够使用与 Databricks 文件系统相关的熟悉文件路径与云对象存储进行交互。 装载的工作原理是,在存储以下信息的 /mnt 目录中创建本地别名:

  • 云对象存储的位置。
  • 用于连接到存储帐户或容器的驱动程序规范。
  • 访问数据所需的安全凭据。

装载存储的语法是什么?

source 指定对象存储的 URI(并且可以选择对安全凭据进行编码)。 mount_point 指定 /mnt 目录中的本地路径。 某些对象存储源支持可选的 encryption_type 参数。 对于某些访问模式,你可以将其他配置规范作为字典传递给 extra_configs

注意

Databricks 建议使用 extra_configs 将特定于装载的 Spark 和 Hadoop 配置设置为选项。 这样可以确保配置绑定到装载而不是群集或会话。

dbutils.fs.mount(
  source: str,
  mount_point: str,
  encryption_type: Optional[str] = "",
  extra_configs: Optional[dict[str:str]] = None
)

在配置或更改数据装载之前,请咨询工作区和云管理员,因为配置不当可能会为工作区中的所有用户提供不安全的访问。

注意

除本文中所述的方法外,还可使用 Databricks Terraform 提供程序databricks_mount 自动装载存储桶。

卸载装入点

若要卸载装入点,请使用以下命令:

dbutils.fs.unmount("/mnt/<mount-name>")

警告

为了避免错误,切勿在其他作业正在读取或写入装入点时修改装入点。 修改装载后,请始终在所有其他正在运行的群集上运行 dbutils.fs.refreshMounts(),以传播任何装载更新。 请参阅 refreshMounts 命令 (dbutils.fs.refreshMounts)

使用 ABFS 装载 ADLS Gen2 或 Blob 存储

可以使用 Microsoft Entra ID(以前称为 Azure Active Directory)应用程序服务主体在 Azure 存储帐户中装载数据以进行身份验证。 有关详细信息,请参阅通过 Microsoft Entra ID(以前称为 Azure Active Directory)使用服务主体访问存储

重要

  • Azure Databricks 工作区中的所有用户都有权访问已装载的 ADLS Gen2 帐户。 应仅向用于访问 ADLS Gen2 帐户的服务主体授予对该 ADLS Gen2 帐户的访问权限,不应授予对其他 Azure 资源的访问权限。
  • 通过群集创建装入点后,群集用户可立即访问装入点。 若要在另一个正在运行的群集中使用装入点,则必须在运行的群集上运行 dbutils.fs.refreshMounts(),使新创建的装入点可供使用。
  • 在作业运行时卸载装入点可能会导致错误。 确保生产作业不会在处理过程中卸载存储。
  • 使用机密的装入点不会自动刷新。 如果装载的存储依赖于轮换、过期或删除的机密,则可能会发生错误,例如 401 Unauthorized。 要解决此类错误,必须卸载并重新装载存储。
  • 必须启用分层命名空间 (HNS),才能使用 ABFS 终结点成功装载 Azure Data Lake Storage Gen2 存储帐户。

在笔记本中运行以下命令,以验证并创建装入点。

configs = {"fs.azure.account.auth.type": "OAuth",
          "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
          "fs.azure.account.oauth2.client.id": "<application-id>",
          "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
          "fs.azure.account.oauth2.client.endpoint": "https://login.chinacloudapi.cn/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.chinacloudapi.cn/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)
val configs = Map(
  "fs.azure.account.auth.type" -> "OAuth",
  "fs.azure.account.oauth.provider.type" -> "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
  "fs.azure.account.oauth2.client.id" -> "<application-id>",
  "fs.azure.account.oauth2.client.secret" -> dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
  "fs.azure.account.oauth2.client.endpoint" -> "https://login.chinacloudapi.cn/<directory-id>/oauth2/token")
// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<container-name>@<storage-account-name>.dfs.core.chinacloudapi.cn/",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

Replace

  • <application-id> 替换为 Azure Active Directory 应用程序的“应用程序(客户端) ID”。
  • <scope-name> 替换为 Databricks 机密范围名称。
  • <service-credential-key-name> 替换为包含客户端密码的密钥的名称。
  • <directory-id> 替换为 Azure Active Directory 应用程序的“目录(租户) ID”。
  • <container-name> 替换为 ADLS Gen2 存储帐户中的容器的名称。
  • <storage-account-name> 替换为 ADLS Gen2 存储帐户名称。
  • <mount-name> 替换为 DBFS 中的预期装入点的名称。