使用 Azure Databricks 访问 Azure Data Lake Storage Gen2 和 Blob 存储

使用 Azure Blob 文件系统驱动程序 (ABFS) 从 Azure Databricks 连接到 Azure Blob 存储和 Azure Data Lake Storage Gen2。 Databricks 建议使用群集配置中设置的 Azure 服务主体来保护对 Azure 存储容器的访问。

本文详细介绍如何使用以下方法访问 Azure 存储容器:

  • Unity Catalog 托管外部位置
  • Azure 服务主体
  • SAS 令牌
  • 帐户密钥

你将设置 Spark 属性以为计算环境配置以下凭据之一:

  • 范围为 Azure Databricks 群集
  • 范围为 Azure Databricks 笔记本

还可以使用 Azure 服务主体从 Databricks SQL 访问 Azure 存储;请参阅配置对云存储的访问权限

Databricks 建议使用机密范围来存储所有凭据。

用于存储和访问 Azure Databricks 中数据的弃用模式

下面是已弃用的存储模式:

使用 Unity Catalog 外部位置访问 Azure Data Lake Storage Gen2

备注

Azure Data Lake Storage Gen2 是 Unity Catalog 唯一支持的 Azure 存储类型。

Unity Catalog 使用外部位置管理对 Azure Data Lake Storage Gen2 中数据的访问。 管理员主要使用外部位置来配置 Unity Catalog 外部表,但也可以使用可用特权(READ FILESWRITE FILESCREATE TABLE)将访问权限委托给用户或组。

使用完全限定的 ABFS URI 访问受 Unity Catalog 保护的数据。 由于权限由 Unity Catalog 托管,因此无需传递任何其他选项或配置来进行身份验证。

警告

访问由外部位置托管的数据时,Unity Catalog 会忽略 Spark 配置设置。

读取示例:

dbutils.fs.ls("abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/data")

spark.read.format("parquet").load("abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/data")

spark.sql("SELECT * FROM parquet.`abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/data`")

写入示例:

dbutils.fs.mv("abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/data", "abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/new-location")

df.write.format("parquet").save("abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/new-location")

创建外部表的示例:

df.write.option("path", "abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/table").saveAsTable("my_table")

spark.sql("""
  CREATE TABLE my_table
  LOCATION "abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/table"
  AS (SELECT *
    FROM parquet.`abfss://container@storageAccount.dfs.core.windows.net/external-location/path/to/data`)
""")

使用 Blob 存储或 Azure Data Lake Storage Gen2 的 ABFS URI 直接访问

如果已正确配置用于访问 Azure 存储容器的凭据,则可以使用 URI 与存储帐户中的资源进行交互。 Databricks 建议使用 abfss 驱动程序以获得更高的安全性。

spark.read.load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")

dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
CREATE TABLE <database-name>.<table-name>;

COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.windows.net/path/to/folder'
FILEFORMAT = CSV
COPY_OPTIONS ('mergeSchema' = 'true');

将 OAuth 2.0 与 Azure 服务主体配合使用来访问 Azure Data Lake Storage Gen2 或 Blob 存储

可将 OAuth 2.0 与 Azure Active Directory (Azure AD) 应用程序服务主体配合使用来安全地访问 Azure 存储帐户中的数据,以便进行身份验证;请参阅使用 Azure Active Directory 服务主体配置对 Azure 存储的访问权限

service_credential = dbutils.secrets.get(scope="<scope>",key="<service-credential-key>")

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

替换

  • <scope> 替换为 Databricks 机密范围名称。
  • <service-credential-key> 替换为包含客户端密码的密钥的名称。
  • <storage-account> 替换为 Azure 存储帐户的名称。
  • <application-id> 替换为 Azure Active Directory 应用程序的“应用程序(客户端) ID”。
  • <directory-id> 替换为 Azure Active Directory 应用程序的“目录(租户) ID”。

使用 SAS 令牌访问 Azure Data Lake Storage Gen2 或 Blob 存储

你可以使用存储共享访问签名 (SAS) 直接访问 Azure Data Lake Storage Gen2 存储帐户。 使用 SAS,你可以通过具有细粒度访问控制的临时令牌来限制对存储帐户的访问。

可以在同一个 Spark 会话中为多个存储帐户配置 SAS 令牌。

注意

Databricks Runtime 7.5 及更高版本中提供了 SAS 支持。

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.windows.net", "<token>")

使用帐户密钥访问 Azure Data Lake Storage Gen2 或 Blob 存储

可以使用存储帐户访问密钥来管理对 Azure 存储的访问权限。

spark.conf.set(
    "fs.azure.account.key.<storage-account>.dfs.core.windows.net",
    dbutils.secrets.get(scope="<scope>", key="<storage-account-access-key>"))

替换

  • <storage-account> 替换为 Azure 存储帐户名称。
  • <scope> 替换为 Azure Databricks 机密范围名称。
  • <storage-account-access-key> 替换为包含 Azure 存储帐户访问密钥的密钥的名称。

示例笔记本

具有 Azure 服务主体笔记本的 ADLS Gen2 OAuth 2.0

获取笔记本

Azure Data Lake Storage Gen2 常见问题解答和已知问题

请参阅 Azure Data Lake Storage Gen2 常见问题解答和已知问题