配置 hadoop-azure abfs 驱动程序以作为 az CLI 用户使用存储帐户进行身份验证

问题描述 投票:0回答:1

我正在尝试弄清楚如何配置 ABFS — Azure Data Lake Storage Gen2 驱动程序,以在通过 Azure CLI 登录的用户(普通用户)时使用 Azure 存储帐户进行身份验证。

出于各种原因(例如需要避免使用共享凭据以及需要审核用户对存储帐户的访问),我们无法使用 SharedKey、SAS 或 OAuth(ClientCredsTokenProvider、UserPasswordTokenProvider、MsiTokenProvider)。

我们希望以某种方式利用 RefreshTokenBasedTokenProvider。

RefreshTokenBasedTokenProvider 需要以下内容,但我不知道如何轻松获取这些值

  • fs.azure.account.oauth2.refresh.token
  • fs.azure.account.oauth2.refresh.endpoint
    (默认为“https://login.microsoftonline.com/Common/oauth2/token”)
  • fs.azure.account.oauth2.client.id

我在 hadoop 文档、github 存储库 https://github.com/apache/hadoop/tree/trunk/hadoop-tools/hadoop-azure 或 Microsoft 网站上找不到任何内容。

ABFS dreiver 上的 Azure 文档明确指出可以对最终用户进行身份验证,但没有提及如何进行身份验证。

Microsoft Entra ID OAuth 承载令牌:驱动程序使用最终用户的身份或配置的服务主体来获取和刷新 Microsoft Entra 承载令牌。

尝试使用

az account get-access-token

给出的访问令牌。但是,我确信我使用的 client_id 是错误的。尝试过用户对象 ID。因此,以下错误可能没有帮助。此外,该令牌是访问令牌而不是刷新令牌,因此可能不是正确使用的令牌。

'org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator$HttpException: HTTP Error 400; url='https://login.microsoftonline.com/Common/oauth2/token' AADToken: HTTP connection to https://login.microsoftonline.com/Common/oauth2/token failed for getting token from AzureAD.; requestId='ffffffff-ffff-ffff-ffff-ffffffffffff'; contentType='application/json; charset=utf-8'; response '{"error":"invalid_grant","error_description":"AADSTS9002313: Invalid request. Request is malformed or invalid. Trace ID: ffffffff-ffff-ffff-ffff-ffffffffffff Correlation ID: ffffffff-ffff-ffff-ffff-ffffffffffff Timestamp: 2023-11-01 18:17:54Z","error_codes":[9002313],"timestamp":"2023-11-01 18:17:54Z","trace_id":"ffffffff-ffff-ffff-ffff-ffffffffffff","correlation_id":"ffffffff-ffff-ffff-ffff-ffffffffffff","error_uri":"https://login.microsoftonline.com/error?code=9002313"}'
旁注:我知道必须可以进行身份验证。我已经看到,在 Synapse 中能够以登录的 azure 用户身份进行身份验证,但我无法弄清楚这是如何完成的。不过,这里的上下文不涉及Synapse。我们无法使用 Synapse 来完成这项工作

azure hadoop azure-data-lake-gen2
1个回答
0
投票
根据

文档,以下是连接到 ADLS Gen2 的方法: 1. 使用 Azure 服务主体的 OAuth 2.0。 2. 共享访问签名(SAS)。 3. 帐户密钥。您可以配置 hadoop-azure abfs 驱动程序以使用存储帐户进行身份验证,如下图所示:

创建 Synapse 笔记本并运行以下代码进行配置:

service_credential ="<clientSecret>" spark.conf.set("fs.azure.account.auth.type.adlss.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.adlss.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") spark.conf.set("fs.azure.account.oauth2.client.id.adlss.dfs.core.windows.net", "<clientId>") spark.conf.set("fs.azure.account.oauth2.client.secret.adlss.dfs.core.windows.net", service_credential) spark.conf.set("fs.azure.account.oauth2.client.endpoint.adlss.dfs.core.windows.net", "https://login.microsoftonline.com/<tenantId>/token")
配置完成后,您将能够访问Data Lake存储帐户。尝试使用下面的示例代码:

mssparkutils.fs.ls("abfss://<containerName>@<storageAccountName>.dfs.core.windows.net/<directory>")
您将得到如下输出:

enter image description here

否则,无需配置,您可以通过向用户添加存储 Blob 数据贡献者角色来访问存储帐户。要添加角色,请按照以下步骤操作:

进入存储帐户的访问控制,单击添加,然后选择添加角色分配,如下所示:

enter image description here

搜索

Storage Blob Data Contributor角色,选择它,然后单击“下一步”,如下所示:

enter image description here

选择成员并点击“审核+分配”,如下所示:

enter image description here

分配角色后,您将无需任何身份验证即可访问存储帐户,如下所示:

filepath = 'abfss://<containerName>@<storageAccountName>.dfs.core.windows.net/inputs/stocplace.csv' df= spark.read.csv(filepath, header='true') display(df)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.