使用distcp复制到Azure ADLS Gen1失败并显示403

时间:2020-05-07 15:26:53

标签: azure azure-storage azure-data-lake distcp

在尝试使用OAuth2进行身份验证时,我试图复制到Azure Data Lake Storage(ADLS)Gen1。

我遇到以下错误:

com.microsoft.azure.datalake.store.ADLException:获取文件/ myContainer的信息时出错 GETFILESTATUS操作因HTTP403失败:null

这是我的distcp的样子

hadoop distcp 
    -Dfs.adl.oauth2.access.token.provider.type=ClientCredential 
    -Dfs.adl.oauth2.client.id=<client_id>
    -Dfs.adl.oauth2.credential=<key>
    -Dfs.adl.oauth2.refresh.url=https://login.microsoftonline.com/*****/oauth2/token 
hdfs:///path/to/file 
adl://adlsgen1.blob.core.windows.net/myContainer

有什么想法会导致这种情况吗?

1 个答案:

答案 0 :(得分:1)

如果要使用Azure AD通过服务主体访问Azure数据湖gen2,我们需要configure RABC role作为服务主体。

例如

  1. 创建服务主体并将Storage Blob Data Owner分配给sp(我使用Azure CLI)。
az ad sp create-for-rbac -n "MyApp" --role "Storage Blob Data Owner"\
    --scopes /subscriptions/{SubID}/resourceGroups/{ResourceGroup1} \
    /subscriptions/{SubID}/resourceGroups/{ResourceGroup2}
  1. 配置
hadoop distcp 
    -D fs.azure.account.auth.type=OAuth 
    -D fs.azure.account.oauth.provider.type=org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider
    -D fs.azure.account.oauth2.client.endpoint=[token endpoint],
    -D fs.azure.account.oauth2.client.id=[Application client ID],
    -D fs.azure.account.oauth2.client.secret=[client secret]
hdfs:///path/to/file 
abfs://container1@abfswales1.dfs.core.windows.net/

有关更多详细信息,请参阅documentdocument