从 Azure Databricks 访问 Azure Data Lake Storage Gen1
Microsoft 已宣布计划停用 Azure Data Lake Storage Gen1(原 Azure Data Lake Store,也称为 ADLS),并建议所有用户迁移到 Azure Data Lake Storage Gen2。 Databricks 建议升级到 Azure Data Lake Storage Gen2,以获得最佳性能和新功能。
有两种方法可以访问 Azure Data Lake Storage Gen1:
- 传递 Azure Active Directory 凭据,也称为凭据传递。
- 直接使用服务主体。
使用你的 Azure Active Directory 凭据自动访问
可使用登录 Azure Databricks 时所用的相同 Azure Active Directory (Azure AD) 标识,自动从 Azure Databricks 群集向 Azure Data Lake Storage Gen1 进行身份验证。 为群集启用 Azure AD 凭据传递后,在该群集上运行的命令可在 Azure Data Lake Storage Gen1 中读取和写入数据,无需你配置用于访问存储的服务主体凭据。
有关完整设置和使用说明,请参阅使用 Azure Active Directory 凭据传递访问 Azure Data Lake Storage。
创建服务主体并向其授予权限
如果所选访问方法需要具有足够权限的服务主体,而你没有这样的服务主体,请按照以下步骤操作:
- 创建可访问资源的 Azure AD 应用程序和服务主体。 请注意以下属性:
application-id:唯一标识客户端应用程序的 ID。directory-id:唯一标识 Azure AD 实例的 ID。service-credential:一个字符串,应用程序用来证明其身份。
- 注册服务主体,并在 Azure Data Lake Storage Gen1 帐户上授予正确的角色分配,如参与者。
使用服务主体和 OAuth 2.0 通过 Spark API 直接访问
若要从 Azure Data Lake Storage Gen1 帐户读取数据,可以将 Spark 配置为在笔记本中结合使用服务凭据和以下代码片段:
spark.conf.set("fs.adl.oauth2.access.token.provider.type", "ClientCredential")
spark.conf.set("fs.adl.oauth2.client.id", "<application-id>")
spark.conf.set("fs.adl.oauth2.credential", dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"))
spark.conf.set("fs.adl.oauth2.refresh.url", "https://login.microsoftonline.com/<directory-id>/oauth2/token")
其中
设置凭据后,可以使用标准 Spark 和 Databricks API 访问资源。 例如:
val df = spark.read.format("parquet").load("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")
dbutils.fs.ls("adl://<storage-resource>.azuredatalakestore.net/<directory-name>")
Azure Data Lake Storage Gen1 提供目录级访问控制,因此服务主体必须有权访问要读取的目录以及 Azure Data Lake Storage Gen1 资源。
通过元存储访问
若要访问元存储中指定的 adl:// 位置,必须在创建群集时将 Hadoop 凭据配置选项指定为 Spark 选项,具体方法是将 spark.hadoop. 前缀添加到相应的 Hadoop 配置键,以将其传播到元存储所用的 Hadoop 配置:
spark.hadoop.fs.adl.oauth2.access.token.provider.type ClientCredential
spark.hadoop.fs.adl.oauth2.client.id <application-id>
spark.hadoop.fs.adl.oauth2.credential <service-credential>
spark.hadoop.fs.adl.oauth2.refresh.url https://login.microsoftonline.com/<directory-id>/oauth2/token
警告
- 这些凭据可供访问群集的所有用户使用。
装载 Azure Data Lake Storage Gen1 资源或文件夹
若要装载 Azure Data Lake Storage Gen1 资源或其内部文件夹,请使用以下命令:
.. code-language-tabs:
```python
configs = {"fs.adl.oauth2.access.token.provider.type": "ClientCredential",
"fs.adl.oauth2.client.id": "<application-id>",
"fs.adl.oauth2.credential": dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
"fs.adl.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)
val configs = Map(
"fs.adl.oauth2.access.token.provider.type" -> "ClientCredential",
"fs.adl.oauth2.client.id" -> "<application-id>",
"fs.adl.oauth2.credential" -> dbutils.secrets.get(scope = "<scope-name>", key = "<key-name-for-service-credential>"),
"fs.adl.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)
其中
<mount-name>是 DBFS 路径,用于表示帐户或其中的文件夹(在source中指定)将在 DBFS 中装载的位置。
像访问本地文件一样访问容器中的文件,例如:
.. code-language-tabs::
df = spark.read.format("text").load("/mnt/<mount-name>/....")
df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")
val df = spark.read.format("text").load("/mnt/<mount-name>/....")
val df = spark.read.format("text").load("dbfs:/mnt/<mount-name>/....")
## <a id="mount-adls"> </a><a id="set-up-service-credentials-for-multiple-accounts"> </a>Set up service credentials for multiple accounts
You can set up service credentials for multiple Azure Data Lake Storage Gen1 accounts for use within in a single Spark session by adding ``account.<account-name>`` to the configuration keys. For example, if you want to set up credentials for both the accounts to access ``adl://example1.azuredatalakestore.net`` and ``adl://example2.azuredatalakestore.net``, you can do this as follows:
```scala
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
以下笔记本演示如何直接使用装载操作访问 Azure Data Lake Storage Gen1。