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

o2gm4chl  于 7个月前  发布在  Hadoop
关注(0)|答案(1)|浏览(116)

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

  • 我们不能使用SharedKey、SAS或OAuth(ClientCredsTokenProvider、UserPasswordTokenProvider、MsiTokenProvider),原因有很多,包括需要避免使用共享凭证,以及需要对存储帐户访问进行审计跟踪,以识别每个事务中的用户。
  • 目前无法使用Azure Synapse或DataBricks

我们希望以某种方式利用RefreshTokenBasedTokenProvider。
RefreshTokenBasedTokenProvider需要以下内容,但我不知道如何轻松获取这些值

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

我在Hadoop文档、Github repo https://github.com/apache/hadoop/tree/trunk/hadoop-tools/hadoop-azure或微软的网站上找不到任何东西。
ABFS驱动程序上的Azure文档明确表示可以对最终用户进行身份验证,但没有提到如何进行身份验证。
Microsoft Entra ID OAuth承载令牌:Microsoft Entra承载令牌由驱动程序使用最终用户的身份或配置的服务主体获取和刷新。
我尝试使用az account get-access-token提供的访问令牌。然而,这是一个访问令牌而不是刷新令牌。此外,我不确定要使用什么客户端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进行这项工作

z5btuh9x

z5btuh9x1#

根据documentation,以下是连接到ADLS Gen 2的方法:1.使用Azure服务主体的OAuth 2.0。2.共享访问签名(SAS)。3.帐户密钥。您可以配置hadoop-azure abfs驱动程序以使用存储帐户进行身份验证,如Synapse中所示:
创建一个Synapse notebook并运行以下代码进行配置:

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>")


您将得到如下输出:
x1c 0d1x的数据
否则,在不进行配置的情况下,您可以通过向用户添加“存储Blob数据参与者”角色来访问存储帐户。要添加角色,请执行以下过程:
转到存储帐户的访问控制,单击添加,然后选择添加角色分配,如下所示:



搜索Storage Blob Data Contributor角色,选中该角色,点击下一步,如下图所示:



选择成员,点击Review + Assign,如下图所示:



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

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

相关问题