讀表失敗由於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代文檔的更多信息。

這篇文章有用嗎?
Baidu