Azure Data Lake 存储 Gen1

注意

Microsoft 已发布其下一代 Data Lake Store,即 Azure Data Lake 存储 Gen2。

Azure Data Lake 存储 Gen1 (以前称为 Azure Data Lake Store,也称为 ADLS) 是适用于大数据分析工作负荷的企业范围的超大规模存储库。 使用 Azure Data Lake 存储 Gen1,可以在单个位置捕获任何大小、类型和 ingesting 速度的数据,以用于操作和探索分析。 Azure Data Lake 存储 Gen1 专用于对存储的数据启用分析,并针对数据分析方案的性能进行优化。

注意

Azure Databricks还支持以下 Azure 数据源:Azure Blob存储、Azure Cosmos DBAzure Synapse Analytics。

有三种方法可以访问 Azure Data Lake 存储 Gen1:

  1. 传递 Azure Active Directory 凭据,也称为凭据传递
  2. 使用服务主体和 OAuth 2.0 将 Azure Data Lake 存储 Gen1 文件系统装载到 DBFS。
  3. 直接使用服务主体。

使用你的 Azure Active Directory 凭据自动访问

可以使用用于登录到 Azure Databricks 的同一 Azure Active Directory (Azure AD) 标识,从 Azure Databricks 群集自动向 Azure Data 存储 Lake Azure Databricks。 为 Azure AD 凭据传递启用群集时,在群集中运行的命令能够在 Azure Data Lake 存储 Gen1 中读取和写入数据,而无需配置用于访问存储的服务主体凭据。

有关完整的设置和使用说明,请参阅使用凭据存储访问 Azure Data Lake Azure Active Directory。

创建服务主体并授予权限

如果所选访问方法需要具有足够权限的服务主体,而你没有这样的服务主体,请按照以下步骤操作:

  1. 创建可访问资源的 Azure AD 应用程序和服务主体。 请注意以下属性:
    • application-id:唯一标识客户端应用程序的 ID。
    • directory-id:唯一标识 Azure AD 实例的 ID。
    • service-credential:一个字符串,应用程序用来证明其身份。
  2. 注册服务主体,在 Azure Data Lake 存储 Gen1 帐户上授予正确的角色分配(例如参与者)。

使用服务主体存储 OAuth 2.0 装载 Azure Data Lake 存储 Gen1 资源

可以将 Azure Data Lake 存储 Gen1 资源或该资源中的文件夹装载到Databricks 文件系统 (DBFS) 。 此装载是指向一个数据湖存储的指针,因此数据永远不会在本地同步。

重要

  • 工作区中的所有用户Azure Databricks已装载的 Azure Data Lake 存储 Gen1 帐户。 用于访问 Azure Data Lake 存储 Gen1 帐户的服务客户端应仅被授予对 Azure Data Lake 存储 Gen1 帐户的访问权限;不应向它授予对 Azure 中其他资源的访问权限。
  • 通过群集创建装入点后,该群集的用户可立即访问装入点。 若要在另一个正在运行的群集中使用装入点,则必须在运行的群集上运行 dbutils.fs.refreshMounts(),使新创建的装入点可供使用。

DBFS 使用创建装入点时提供的凭据来访问装载的 Azure Data Lake 存储 Gen1 帐户。

将 Azure Data Lake 存储 Gen1 资源或文件夹

若要将 Azure Data Lake 存储 Gen1 资源或该资源中的文件夹装载,请使用以下命令:

Python

configs = {"<prefix>.oauth2.access.token.provider.type": "ClientCredential",
          "<prefix>.oauth2.client.id": "<application-id>",
          "<prefix>.oauth2.credential": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
          "<prefix>.oauth2.refresh.url": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

Scala

val configs = Map(
  "<prefix>.oauth2.access.token.provider.type" -> "ClientCredential",
  "<prefix>.oauth2.client.id" -> "<application-id>",
  "<prefix>.oauth2.credential" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
  "<prefix>.oauth2.refresh.url" -> "https://login.microsoftonline.com/<directory-id>/oauth2/token")

// Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "adl://<storage-resource>.azuredatalakestore.net/<directory-name>",
  mountPoint = "/mnt/<mount-name>",
  extraConfigs = configs)

where

  • <prefix> 适用于 fs.adl Databricks Runtime 6.0 及以上,Databricks Runtime dfs.adls 5.5 LTS。

    警告

    对于 Databricks Runtime 6.0 及以上版本,已弃用 dfs.adls. Azure Data Lake 存储 Gen1 配置密钥的前缀,以保留前缀向后兼容性,这意味着仍可使用旧前缀。 fs.adl. 但是,使用旧前缀时有两个注意事项:1。 除非 spark.conf.get 已显式设置,否则使用新前缀的键调用会失败。 2. 引用 Azure Data Lake 存储 Gen1 配置密钥的错误消息始终使用新前缀。 对于 Databricks Runtime 5.5 LTS,必须始终使用旧前缀。

  • <mount-name>是一个 DBFS 路径,表示 Azure Data Lake 存储 Gen1 帐户或其中一个文件夹 (中指定的) 将装载到 source DBFS 中。

  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 检索存储帐户访问密钥,该密钥已 dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 范围 中的机密

像访问本地文件一样访问容器中的文件,例如:

Python

df = spark.read.text("/mnt/%s/...." % <mount-name>)
df = spark.read.text("dbfs:/<mount-name>/....")

Scala

val df = spark.read.text("/mnt/<mount-name>/....")
val df = spark.read.text("dbfs:/<mount-name>/....")

卸载装入点

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

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

使用服务主体和 OAuth 2.0 通过 Spark API 直接访问

可以直接访问 Azure Data Lake 存储 Gen1 存储帐户 (而不是使用服务主体通过 OAuth 2.0 装载 DBFS) 。

使用 DataFrame API 访问

若要从 Azure Data Lake 存储 Gen1 帐户进行读取,可以将 Spark 配置为在笔记本中使用以下代码片段使用服务凭据:

spark.conf.set("<prefix>.oauth2.access.token.provider.type", "ClientCredential")
spark.conf.set("<prefix>.oauth2.client.id", "<application-id>")
spark.conf.set("<prefix>.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"))
spark.conf.set("<prefix>.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id>/oauth2/token")

where

  • <prefix> 适用于 fs.adl Databricks Runtime 6.0 及以上,Databricks Runtime dfs.adls 5.5 LTS。

    警告

    对于 Databricks Runtime 6.0 及以上版本,已弃用 dfs.adls. Azure Data Lake 存储 Gen1 配置密钥的前缀,以保留前缀向后兼容性,这意味着仍可使用旧前缀。 fs.adl. 但是,使用旧前缀时有两个注意事项:1。 除非 spark.conf.get 已显式设置,否则使用新前缀的键调用会失败。 2. 引用 Azure Data Lake 存储 Gen1 配置密钥的错误消息始终使用新前缀。 对于 Databricks Runtime 5.5 LTS,必须始终使用旧前缀。

  • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 检索存储帐户访问密钥,该密钥已 dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 范围 中的机密

设置凭据后,可以使用标准 Spark 和 Databricks API 从资源读取数据。 例如:

val df = spark.read.parquet("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

dbutils.fs.ls("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")

Azure Data Lake 存储 Gen1 提供目录级别的访问控制,因此服务主体必须有权访问要读取的目录以及 Azure Data Lake 存储 Gen1 资源。

使用 RDD API 访问

不能通过 SparkContext 访问使用 spark.conf.set(...) 设置的 Hadoop 配置选项。 也就是说,当这些内容对数据帧和数据集 API 可见时,就对 RDD API 不可见。 如果使用 RDD API 从 Azure Data Lake 存储 Gen1 进行读取,则必须使用下列方法之一设置凭据:

  • 创建群集时,将 Hadoop 凭据配置选项指定为 Spark 选项。 必须将前缀添加到相应的 Hadoop 配置密钥,以将其传播到用于 RDD 作业的 spark.hadoop. Hadoop 配置:

    spark.hadoop.<prefix>.oauth2.access.token.provider.type ClientCredential
    spark.hadoop.<prefix>.oauth2.client.id <application-id>
    spark.hadoop.<prefix>.oauth2.credential <service-credential>
    spark.hadoop.<prefix>.oauth2.refresh.url "https://login.microsoftonline.com/<directory-id>/oauth2/token"
    
  • Scala 用户可在 spark.sparkContext.hadoopConfiguration 中设置凭据:

    spark.sparkContext.hadoopConfiguration.set("<prefix>.oauth2.access.token.provider.type", "ClientCredential")
    spark.sparkContext.hadoopConfiguration.set("<prefix>.oauth2.client.id", "<application-id>")
    spark.sparkContext.hadoopConfiguration.set("<prefix>.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"))
    spark.sparkContext.hadoopConfiguration.set("<prefix>.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id>/oauth2/token")
    

    where

    • <prefix> 适用于 fs.adl Databricks Runtime 6.0 及以上,Databricks Runtime dfs.adls 5.5 LTS。

      警告

      对于 Databricks Runtime 6.0 及以上版本,已弃用 dfs.adls. Azure Data Lake 存储 Gen1 配置密钥的前缀,以保留前缀向后兼容性,这意味着仍可使用旧前缀。 fs.adl. 但是,使用旧前缀时有两个注意事项:1。 除非 spark.conf.get 已显式设置,否则使用新前缀的键调用会失败。 2. 引用 Azure Data Lake 存储 Gen1 配置密钥的错误消息始终使用新前缀。 对于 Databricks Runtime 5.5 LTS,必须始终使用旧前缀。

    • dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 检索存储帐户访问密钥,该密钥已 dbutils.secrets.get(scope = "<scope-name>", key = "<key-name>") 范围 中的机密

警告

这些凭据可供访问群集的所有用户使用。

通过元存储访问

若要访问元存储中指定的位置,必须在创建群集时将 Hadoop 凭据配置选项指定为 Spark 选项,具体方法为将前缀添加到相应的 Hadoop 配置密钥,以将其传播到元存储使用的 adl://spark.hadoop. Hadoop 配置:

spark.hadoop.<prefix>.oauth2.access.token.provider.type ClientCredential
spark.hadoop.<prefix>.oauth2.client.id <application-id>
spark.hadoop.<prefix>.oauth2.credential <service-credential>
spark.hadoop.<prefix>.oauth2.refresh.url https://login.microsoftonline.com/<directory-id>/oauth2/token

其中 <prefix> 适用于 fs.adl Databricks Runtime 6.0 及以上,Databricks Runtime dfs.adls 5.5 LTS。

警告

  • 对于 Databricks Runtime 6.0 及以上版本,已弃用 dfs.adls. Azure Data Lake 存储 Gen1 配置密钥的前缀,以保留前缀向后兼容性,这意味着仍可使用旧前缀。 fs.adl. 但是,使用旧前缀时有两个注意事项:1。 除非 spark.conf.get 已显式设置,否则使用新前缀的键调用会失败。 2. 引用 Azure Data Lake 存储 Gen1 配置密钥的错误消息始终使用新前缀。 对于 Databricks Runtime 5.5 LTS,必须始终使用旧前缀。
  • 这些凭据可供访问群集的所有用户使用。

为多个帐户设置服务凭据

注意

需要Databricks Runtime 6.0 或以上。

可以通过将 添加到配置密钥,为多个 Azure Data Lake 存储 Gen1 帐户设置服务凭据,以在单个 Spark 会话中 account.<account-name> 使用。 例如,如果要为要访问 的帐户和 设置凭据,可以 adl://example1.azuredatalakestore.netadl://example2.azuredatalakestore.net 按如下所示操作:

spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")

spark.conf.set("fs.adl.account.example1.oauth2.client.id", "<application-id-example1>")
spark.conf.set("fs.adl.account.example1.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example1>"))
spark.conf.set("fs.adl.account.example1.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example1>/oauth2/token")

spark.conf.set("fs.adl.account.example2.oauth2.client.id", "<application-id-example2>")
spark.conf.set("fs.adl.account.example2.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential-example2>"))
spark.conf.set("fs.adl.account.example2.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id-example2>/oauth2/token")

这还适用于群集 Spark 配置

spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential

spark.hadoop.fs.adl.account.example1.oauth2.client.id <application-id-example1>
spark.hadoop.fs.adl.account.example1.oauth2.credential <service-credential-example1>
spark.hadoop.fs.adl.account.example1.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example1>/oauth2/token

spark.hadoop.fs.adl.account.example2.oauth2.client.id <application-id-example2>
spark.hadoop.fs.adl.account.example2.oauth2.credential <service-credential-example2>
spark.hadoop.fs.adl.account.example2.oauth2.refresh.url https://login.microsoftonline.com/<directory-id-example2>/oauth2/token

以下笔记本演示如何使用 Databricks Runtime 6.0 中引入的配置密钥前缀,通过装载直接访问 Azure Data Lake 存储 fs.adl Gen1。 如果要在 5.5 LTS Databricks Runtime笔记本,将前缀更改为 dfs.adls

ADLS Gen1服务主体笔记本

获取笔记本