我正在尝试弄清楚如何配置 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 来完成这项工作
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>")
您将得到如下输出:
否则,无需配置,您可以通过向用户添加存储 Blob 数据贡献者角色来访问存储帐户。要添加角色,请按照以下步骤操作:
进入存储帐户的访问控制,单击添加,然后选择添加角色分配,如下所示:
搜索
Storage Blob Data Contributor角色,选择它,然后单击“下一步”,如下所示:
选择成员并点击“审核+分配”,如下所示:
分配角色后,您将无需任何身份验证即可访问存储帐户,如下所示:
filepath = 'abfss://<containerName>@<storageAccountName>.dfs.core.windows.net/inputs/stocplace.csv'
df= spark.read.csv(filepath, header='true')
display(df)