对azure数据湖gen2的hadoop客户端用户名和密码访问问题

falq053o  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(571)

尝试通过控制台中的hadoop客户端使用用户名和密码身份验证类型连接到azure data lake storage gen2并收到错误

java.lang.NullPointerException
        at org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.consumeInputStream(AzureADAuthenticator.java:341)
        at org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.getTokenSingleCall(AzureADAuthenticator.java:271)
        at org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.getTokenCall(AzureADAuthenticator.java:212)
        at org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.getTokenUsingClientCreds(AzureADAuthenticator.java:95)
        at org.apache.hadoop.fs.azurebfs.oauth2.UserPasswordTokenProvider.refreshToken(UserPasswordTokenProvider.java:54)
        at org.apache.hadoop.fs.azurebfs.oauth2.AccessTokenProvider.getToken(AccessTokenProvider.java:50)
        at org.apache.hadoop.fs.azurebfs.services.AbfsClient.getAccessToken(AbfsClient.java:546)
        at org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation.executeHttpOperation(AbfsRestOperation.java:150)
        at org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation.execute(AbfsRestOperation.java:124)
        at org.apache.hadoop.fs.azurebfs.services.AbfsClient.getFilesystemProperties(AbfsClient.java:197)
        at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getIsNamespaceEnabled(AzureBlobFileSystemStore.java:181)
        at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore.getFileStatus(AzureBlobFileSystemStore.java:454)
        at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.getFileStatus(AzureBlobFileSystem.java:395)
        at org.apache.hadoop.fs.Globber.getFileStatus(Globber.java:65)
        at org.apache.hadoop.fs.Globber.doGlob(Globber.java:294)
        at org.apache.hadoop.fs.Globber.glob(Globber.java:149)
        at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:2016)
        at org.apache.hadoop.fs.shell.PathData.expandAsGlob(PathData.java:353)
        at org.apache.hadoop.fs.shell.Command.expandArgument(Command.java:250)
        at org.apache.hadoop.fs.shell.Command.expandArguments(Command.java:233)
        at org.apache.hadoop.fs.shell.FsCommand.processRawArguments(FsCommand.java:104)
        at org.apache.hadoop.fs.shell.Command.run(Command.java:177)
        at org.apache.hadoop.fs.FsShell.run(FsShell.java:327)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:90)
        at org.apache.hadoop.fs.FsShell.main(FsShell.java:390)

所做的:
使用创建存储帐户https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-quickstart-create-account
已使用创建azure ad应用程序https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal
将ad用户作为访问控制(iam)中的存储blob数据所有者添加到存储帐户。
根据apache文档,我创建了一个console命令

hadoop fs -Dfs.azure.ssl.channel.mode=Default_JSSE
-Dfs.azure.account.auth.type=OAuth
-Dfs.azure.account.oauth.provider.type=org.apache.hadoop.fs.azurebfs.oauth2.UserPasswordTokenProvider
-Dfs.azure.account.oauth2.client.endpoint=https://login.microsoftonline.com/<TENANT ID>/oauth2/v2.0/authorize
-Dfs.azure.account.oauth2.user.name=<USER_NAME@mail.com>
-Dfs.azure.account.oauth2.user.password=<PASSWORD>
-ls abfss://<CONTAINER NAME>@<STORAGE ACCOUNT>.dfs.core.windows.net/

如果尝试使用此终结点

https://login.microsoftonline.com/<TENANT ID>/oauth2/v2.0/token

输出为

ls: AADToken: HTTP connection failed for getting token from AzureAD. Http response: 400 Bad Request

因此下面的命令应该显示容器中文件夹和文件的列表。azure中的命令或容器配置有问题吗?请给我建议。

dddzy1tm

dddzy1tm1#

无论您使用的是azure ad用户还是服务主体,都必须使用oauth2 v1令牌终结点,因为它是authenticator类支持的终结点。这是令牌终结点url:

https://login.microsoftonline.com/{TENANT_ID}/oauth2/token

在这里您可以找到v1和v2端点之间的差异。
也就是说,您必须使用的控制台命令变成:

hadoop fs -Dfs.azure.ssl.channel.mode=Default_JSSE \
-Dfs.azure.account.auth.type=OAuth \
-Dfs.azure.account.oauth.provider.type=org.apache.hadoop.fs.azurebfs.oauth2.UserPasswordTokenProvider \
-Dfs.azure.account.oauth2.client.endpoint=https://login.microsoftonline.com/{TENANT_ID}/oauth2/token \
-Dfs.azure.account.oauth2.user.name={USER_NAME@mail.com} \
-Dfs.azure.account.oauth2.user.password={PASSWORD} \
-ls abfss://{CONTAINER NAME}@{STORAGE_ACCOUNT}.dfs.core.windows.net/

根据您的问题,您可能也想使用服务主体进行身份验证,在这种情况下,您必须使用clientcredstokenprovider而不是userpasswordtokenprovider,如下所示:

hadoop fs -Dfs.azure.ssl.channel.mode=Default_JSSE \
-Dfs.azure.account.auth.type=OAuth \
-Dfs.azure.account.oauth.provider.type=org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider \
-Dfs.azure.account.oauth2.client.endpoint=https://login.microsoftonline.com/{TENANT_ID}/oauth2/token \
-Dfs.azure.account.oauth2.client.id={CLIENT_ID} \
-Dfs.azure.account.oauth2.client.secret={SECRET_KEY} \
-ls abfss://{CONTAINER NAME}@{STORAGE_ACCOUNT}.dfs.core.windows.net/

您还可以将auth信息存储在core-site.xml文件中,正如hadoop文档中所解释的那样。如果要使用多个存储帐户,可以将属性名称更改为以dfs端点结尾,如下一个示例所示:

<property>
  <name>fs.azure.account.auth.type.{STORAGE_ACCOUNT}.dfs.core.windows.net</name>
  <value>OAuth</value>
  <description>
  Use OAuth authentication
  </description>
</property>
<property>
  <name>fs.azure.account.oauth.provider.type.{STORAGE_ACCOUNT}.dfs.core.windows.net</name>
  <value>org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider</value>
  <description>
  Use client credentials
  </description>
</property>
<property
  <name>fs.azure.account.oauth2.client.endpoint.{STORAGE_ACCOUNT}.dfs.core.windows.net</name>
  <value>https://login.microsoftonline.com/{TENANT_ID}/oauth2/token</value>
  <description>
  URL of OAuth endpoint
  </description>
</property>
<property>
  <name>fs.azure.account.oauth2.client.id.{STORAGE_ACCOUNT}.dfs.core.windows.net</name>
  <value>{CLIENT_ID}</value>
  <description>
  Client ID
  </description>
</property>
<property>
  <name>fs.azure.account.oauth2.client.secret.{STORAGE_ACCOUNT}.dfs.core.windows.net</name>
  <value>{SECRET_KEY}</value>
  <description>
  Secret
  </description>
</property>

抱歉,如果太晚了,我只是遇到了这个问题,这个问题是在寻找解决办法的道路上,当我得到它的工作,我想有人可能会发现这个有用的。

相关问题