Azure Synapse 超时 - 令牌过期

问题描述 投票:0回答:1

背景故事:我在 Gen2 存储中有 12 个 zip 文件,每个文件大约 300 mb。 我正在管道作业中运行笔记本。 一切顺利,直到使用 pd.read_csv(compression ='zip') 提取第 6 个 zip 文件。 在 27 分 57 秒左右,令牌已过期。

所以我打开并播放了突触笔记本。

ClientAuthenticationError:服务器无法验证请求。请参阅 www-authenticate 标头中的信息。

错误代码:无效的身份验证信息 Authenticationerrordetail:生命周期验证失败。令牌已过期。

当我运行管道时,它会在类似的位置停止。

我使用的是最低限度,因为我的公司没有足够的资金来增加节点等。微软建议应用失败重试。还表示突触无法处理非用户身份的令牌刷新。

有解决办法吗?或者有屏幕截图可以帮助我吗?谢谢!

timeout access-token azure-synapse azure-synapse-pipeline
1个回答
0
投票

在突触中,您可以选择以下身份验证选项。

使用链接服务使用存储选项

  1. 创建与 adls gen 2 帐户的链接服务并在读取文件时使用它。

enter image description here

您可以使用系统或用户管理的身份进行身份验证。

代码:

import pandas as pd
   
df = pd.read_csv('abfs://<container_name>@<storage_acc_name>.dfs.core.windows.net/<path>/parse1_data_preview.csv', storage_options = {'linked_service' : '<linked_service_name>'})
df

输出:

enter image description here

这不会过期,链接服务会处理这些事情。

  1. 在下面的存储选项中,您可以传递以下凭据。

代码:

   import pandas
   
   #read data file
   df = pandas.read_csv('abfs://file_system_name@account_name.dfs.core.windows.net/   file_path', storage_options = {'account_key' : 'account_key_value'})
 
   ## or storage_options = {'sas_token' : 'sas_token_value'}
   ## or storage_options = {'connection_string' : 'connection_string_value'}
   ## or storage_options = {'tenant_id': 'tenant_id_value', 'client_id' : 'client_id_value',    'client_secret': 'client_secret_value'}

这里我推荐使用

tenant_id
client_id
client_secret

请参阅以下文档了解更多信息。

教程:使用 Pandas 读取/写入 Synapse Analytics 中无服务器 Apache Spark 池中的 ADLS 数据 - Azure Synapse Analytics |微软学习

教程:使用 FSSPEC 在 Synapse Analytics 中的无服务器 Apache Spark 池中读取/写入 ADLS 数据 - Azure Synapse Analytics |微软学习

如果您仍想使用代币,您需要继续检查是否过期。

以下是逻辑,大家根据自己的需求修改。

token_expiry_buffer = 300 
token_expiry_time = 0

def get_token():
    global token_expiry_time
    token = credential.get_token("https://storage.azure.com/")
    token_expiry_time = token.expires_on
    return token

def is_token_expired():
    current_time = time.time()
    return current_time >= (token_expiry_time - token_expiry_buffer)
    
paths = ["zip1path","zip2path","zip3path"...]

for path in paths:
    if is_token_expired:
    #refresh the token
        get_token()
    df = pd.read_csv("path")
© www.soinside.com 2019 - 2024. All rights reserved.