读表失败由于AAD ADLS Gen2牌超时

代存储访问ADLS失败如果广告服务主体的令牌过期或无效。

写的John.Lourdu

去年发表在:2022年11月30日


问题

代存储访问ADLS可以配置使用OAuth 2.0 Azure服务主体。你可以安全地访问数据在Azure存储账户使用OAuth 2.0 Azure Active Directory (Azure广告)应用程序服务主体进行身份验证。

你试图访问外部表(表存储在根存储位置)存储在ADLS代。访问失败,并显示一条ADLException错误和一个IOException: AADToken超时错误。

警告DeltaLog:未能解析dbfs: / mnt / <表路径在ADLS Gen2存储容器>。这可能发生,如果有一个错误读操作期间,或文件似乎部分。睡觉并再次尝试。com.microsoft.azure.datalake.store。ADLException: Error getting info for file  Error fetching access tokenOperation null failed with exception java.io.IOException : AADToken: HTTP connection failed for getting token from AzureAD due to timeout. Client Request Id : Latency(ns) : 180152012 Last encountered exception thrown after 5 tries. [java.io.IOException,java.io.IOException,java.io.IOException,java.io.IOException,java.io.IOException] [ServerRequestId:null] Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL:https://login.microsoftonline.com/<;在sun.reflect.GeneratedConstructorAccessor118 directory-id > / oauth2 /令牌。newInstance(未知源)sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java: 45)引起的:. io .IOException:服务器返回的HTTP响应代码:401网址:https://login.microsoftonline.com/<;在sun.reflect.GeneratedConstructorAccessor118 directory-id > / oauth2 /令牌。newInstance(未知源)sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java: 45)
         

导致

代存储失败如果客户机访问ADLS秘密令牌与Azure Active Directory (Azure广告)应用程序服务主体是过期或无效。

解决方案

检查存储帐户访问设置和验证客户秘密是过期的。创建一个新客户秘密令牌,然后重新安装了第二代存储容器ADLS使用新的秘密,或更新客户端与新的秘密秘密令牌ADLS Gen2存储帐户配置。

审查现有的存储账户秘密

检查现有的客户秘密是过期的。

  1. 打开Azure门户
  2. 点击Azure活动目录
  3. 在左边的菜单,看下管理并点击应用程序注册。
  4. 在所有应用程序选项卡,找到应用程序创建Azure砖。你可以搜索应用程序注册显示名称或应用程序(客户端)ID。
  5. 单击您的应用程序。
  6. 在左边的菜单,看下管理并点击证书和秘密
  7. 检查客户的秘密节和检查日期到期列。

创建一个新的秘密令牌

如果现有的客户秘密是过期的,你必须创建一个新的令牌。

  1. 点击新客户的秘密
  2. 输入一个描述和持续时间的秘密。
  3. 点击添加
  4. 客户端显示的秘密。复制价值。它不能被检索后离开该页面。
删除

警告

如果你忘记复制这个秘密价值,你必须重复这些步骤。的价值一旦你离开这个页面不能被检索。返回页面显示的蒙面版本价值

重新安装ADLS Gen2存储新的秘密

一旦你产生了一个新客户的秘密,你可以卸载现有ADLS Gen2存储、更新的秘密信息,然后重新安装存储。

  1. 卸载现有的挂载点。

    % python dbutils.fs.unmount (“/ mnt / < mount-name >”)

    检查dbutils.fs.unmount文档的更多信息。

  2. 重新安装存储账户和新客户的秘密。

  3. 取代

    • <应用程序id >应用程序(客户端)IDAzure的活动目录的应用程序
    • <容器名称>容器的名称
    • < directory-id >目录(租户)IDAzure的活动目录的应用程序
    • < scope-name >砖秘密范围的名称
    • < service-credential-key >的名称包含客户的关键秘密
    • < storage-account >Azure存储账户的名称


    % python款= {" fs.azure.account.auth。”:“OAuth”、“fs.azure.account.oauth.provider类型。”:“org.apache.hadoop.fs.azurebfs.oauth2类型。ClientCredsTokenProvider”、“fs.azure.account.oauth2.client。id”:“<应用程序id >”、“fs.azure.account.oauth2.client。秘密”:dbutils.secrets.get(范围= < scope-name >”,键= < service-credential-key >),“fs.azure.account.oauth2.client。端点”:“https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌”}#可选地,您可以添加<目录路径>源URI的挂载点。dbutils.fs。山(源= " abfss: / / <容器名称> @ < storage-account >.dfs.core.windows.net/ <目录路径>”,mount_point = " / mnt / < mount-name >”, extra_configs =配置)

    检查挂载一个Azure Blob存储容器文档的更多信息。

代替客户端存储账户配置中的秘密

作为替代更新个人坐骑,你可以替换客户端存储账户中的秘密身份验证配置。直接访问的存储账户必须设置。

% python spark.conf.set (“fs.azure.account.auth.type。< storage-account > .dfs.core.windows.net”、“OAuth”) spark.conf.set (“fs.azure.account.oauth.provider.type。< storage-account > .dfs.core.windows.net”,“org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider”) spark.conf.set (“fs.azure.account.oauth2.client.id。< storage-account > .dfs.core.windows.net”,“<应用程序id >”) spark.conf.set (“fs.azure.account.oauth2.client.secret。< storage-account > .dfs.core.windows.net”,“< service_credential_key_name >”) spark.conf.set (“fs.azure.account.oauth2.client.endpoint。< storage-account > .dfs.core.windows.net ", " https://login.microsoftonline.com/ < directory-id > / oauth2 /令牌”)

取代

  • <应用程序id >应用程序(客户端)IDAzure的活动目录的应用程序
  • < directory-id >目录(租户)IDAzure的活动目录的应用程序
  • < service-credential-key >的名称包含客户的关键秘密
  • < storage-account >Azure存储账户的名称

检查访问ADLS代文档的更多信息。

这篇文章有用吗?