使用服务主体创建 Unity Catalog 托管存储(旧版)

重要

本文档已过时,将来可能不会更新。 本内容中提及的产品、服务或技术不再受支持。 若要查看当前管理文档,请参阅管理 Azure Databricks 帐户

本文介绍使用服务主体创建外部位置和托管存储的旧方法。 Databricks 强烈建议使用 Azure 托管标识作为提供存储容器访问权限的标识,而不是服务主体。 请参阅使用 Unity Catalog 中的 Azure 托管标识访问存储

但是,如果仍想使用服务主体,或者已有使用服务主体的 Unity Catalog 托管存储或外部位置,并且想了解该过程,则此存档文章中提供了相关说明。

创建使用服务主体访问的元存储(旧版)

创建服务主体访问的 Unity Catalog 元存储:

  1. 为 Azure Data Lake Storage Gen2 创建存储帐户。

    此帐户中的存储容器将存储元存储的所有托管表,目录或架构中具有其自己的托管存储位置的表除外。

    请参阅创建用于 Azure Data Lake Storage Gen2 的存储帐户。 它必须是 Azure Databricks 工作区所在区域中的一个高级性能 Azure Data Lake Storage Gen2 帐户。

  2. 在新的存储帐户中创建容器。

    记下容器的 ADLSv2 URI,其格式如下:

    abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<metastore-name>
    

    在后续步骤中,将 <storage-container> 替换为此 URI。

  3. 在 Microsoft Entra ID 中,按照使用服务主体和 Microsoft Entra ID (Azure Active Directory) 访问存储中的说明创建服务主体并为其分配存储帐户权限。

    Unity Catalog 将使用此服务主体代表 Unity Catalog 用户访问存储帐户中的容器。 为服务主体生成客户端机密。 查看 MS Entra 服务主体身份验证。 记下服务主体的客户端机密、客户端应用程序 ID 和创建此服务主体的目录 ID。 在下面的步骤中,将 <client-secret><client-application-id><directory-id> 替换为这些值。

  4. 记下这些属性,你将在创建元存储时用到它们:

    • <aad-application-id>
    • 存储帐户区域
    • <storage-container>
    • 服务主体的 <client-secret><client-application-id><directory-id>
  5. 在帐户控制台 UI 中无法创建使用服务主体访问的元存储。 需使用帐户元存储 API来创建。 例如:

    curl -n -X POST --header 'Content-Type: application/json' https://<account-domain>/api/2.0/accounts/<account-id>/metastores
    --data '{
       "metastore_info": {
          "name": "<metastore-name>",
          "storage_root": "<storage-container>",
          "region": "<region>"
          "storage_root_credential_id"
       }
    }'
    

    要了解如何向帐户级 API 进行身份验证,请参阅 MS Entra 服务主体身份验证

    创建元存储的用户是其所有者。 Databricks 建议将元存储的所有权重新分配给组。 请参阅分配元存储管理员

  6. 记下元存储的 ID。 查看元存储的属性时,元存储的 ID 是 URL 中位于 /data 之后和 /configuration 之前的部分。

  7. 已创建元存储,但 Unity Catalog 仍无法向其中写入数据。 完成元存储设置:

    1. 在单独的浏览器中,以工作区管理员身份登录到分配给元存储的工作区。

    2. 记下工作区 URL,它是 URL 的第一部分,位于 https:// 之后,包括 azuredatabricks.net

    3. 生成个人访问令牌。 请参阅令牌管理 API

    4. 将个人访问令牌添加到主目录中的 .netrc 文件。 这可以防止在 shell 的命令历史记录中显示个人访问令牌,从而提高安全性。 请参阅令牌管理 API

    5. 运行以下 cURL 命令,为元存储创建根存储凭据。 替换占位符值替:

      • <workspace-url>:生成个人访问令牌的工作区的 URL。
      • <credential-name>:存储凭据的名称。
      • <directory-id>:创建的服务主体的目录 ID。
      • <application-id>:创建的服务主体的应用程序 ID。
      • <client-secret>:为服务主体生成的客户端密码的值(不是客户端密码 ID)。
      curl -n -X POST --header 'Content-Type: application/json' https://<workspace-url>/api/2.0/unity-catalog/storage-credentials --data "{
         \"name\": \"<credential-name>\",
         \"azure_service_principal\": {
         \"directory_id\": \"<directory-id>\",
         \"application_id\": \"<application-id>\",
         \"client_secret\": \"<client-secret>\"
         }
      }"
      

      记下存储凭据 ID,它是 cURL 命令响应中 id 的值。

  8. 运行以下 cURL 命令,以使用新的根存储凭据更新元存储。 替换占位符值替:

    • <workspace-url>:生成个人访问令牌的工作区的 URL。
    • <metastore-id>:元存储的 ID。
    • <storage-credential-id>:上一个命令中存储凭据的 ID。
    curl -n -X PATCH --header 'Content-Type: application/json' https://<workspace-url>/api/2.0/unity-catalog/metastores/<metastore-id> --data
    "{\"storage_root_credential_id\": \"<storage-credential-id>\"}"
    

现在可以将工作区添加到元存储

创建使用服务主体的存储凭据(旧版)

若要使用服务主体创建存储凭据,你必须是 Azure Databricks 帐户管理员。创建服务主体存储凭据的帐户管理员可以将所有权委托给其他用户或组,以管理其权限。

首先,按照使用服务主体和 Microsoft Entra ID (Azure Active Directory) 访问存储中的说明创建服务主体并为其提供对存储帐户的访问权限。

无法使用目录资源管理器添加服务主体存储凭据。 可以使用存储凭据 API。 例如:

curl -X POST -n \
https://<databricks-instance>/api/2.1/unity-catalog/storage-credentials \
-d '{
   "name": "<storage-credential-name>",
   "read_only": true,
   "azure_service_principal": {
      "directory_id": "<directory-id>",
      "application_id": "<application-id>",
      "client_secret": "<client-secret>"
   },
   "skip_validation": "false"
   }'

还可以使用 Databricks Terraform 提供程序databricks_storage_credential 创建存储凭据。