You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Synapse令牌过期超时问题求助:低成本环境解决方案

解决Synapse Notebook读取ADLS Gen2文件时令牌过期的问题

核心问题分析

你遇到的ClientAuthenticationError是因为长时间运行的Notebook任务中,服务身份(托管身份/服务主体)的访问令牌过期,且Synapse无法自动为非用户身份刷新令牌。结合你使用最低配置、文件处理耗时久的情况,以下是几种可行的低成本解决方案:


方案1:拆分任务为小批次处理

将12个文件拆分到多个Notebook任务中,确保单个任务的运行时间短于令牌有效期(默认令牌有效期通常为60分钟,你的情况单批处理2-3个文件即可)。

操作步骤:

  • 在Synapse管道中使用ForEach活动,遍历ADLS Gen2中的zip文件列表
  • 设置ForEach的批量大小为1或2(根据单文件处理时间调整),每个循环调用一个Notebook处理单个/多个文件
  • 每个Notebook仅负责处理指定的1-2个文件,处理完成后直接释放资源,避免长时间运行导致令牌过期

方案2:在Notebook中手动刷新访问令牌

针对托管身份/服务主体,在Notebook中每隔一段时间手动获取新令牌,替换当前的认证上下文,避免过期。

代码示例:

首先安装依赖包(仅需运行一次):

!pip install azure-identity azure-storage-filedatalake

然后在处理文件的逻辑中加入令牌刷新:

import pandas as pd
from azure.identity import DefaultAzureCredential
from azure.storage.filedatalake import DataLakeServiceClient

# 配置ADLS信息
ACCOUNT_URL = "https://<你的存储账户名>.dfs.core.windows.net"
CONTAINER_NAME = "<你的容器名>"
FILE_LIST = [f"file{i}.zip" for i in range(1,13)]  # 替换为你的实际文件名列表

# 初始化凭证
credential = DefaultAzureCredential()

def get_new_token():
    """获取新的ADLS访问令牌"""
    token = credential.get_token("https://storage.azure.com/.default")
    return token.token

# 处理文件,每处理2个文件刷新一次令牌
for idx, file_name in enumerate(FILE_LIST):
    # 每2个文件刷新一次令牌
    if idx % 2 == 0:
        current_token = get_new_token()
        # 用新令牌初始化客户端
        service_client = DataLakeServiceClient(account_url=ACCOUNT_URL, credential=current_token)
        file_system_client = service_client.get_file_system_client(CONTAINER_NAME)
    
    # 读取文件
    file_client = file_system_client.get_file_client(file_name)
    with file_client.download_file() as file_stream:
        # 可选:优化读取(指定列/分块)
        df = pd.read_csv(file_stream, compression='zip', usecols=['需要的列名'], chunksize=100000)
        # 处理数据逻辑(示例:合并分块)
        result_df = pd.concat(df)
        # 后续操作(如写入到目标表等)

方案3:优化文件读取效率,缩短单文件处理时间

由于使用最低配置,单文件处理耗时过长是累计触发令牌过期的关键,通过优化pandas读取逻辑减少单文件处理时间:

  • 指定需要的列:用usecols参数只读取业务需要的列,减少内存占用和读取时间
  • 分块读取:用chunksize参数将大文件拆分为小块逐批处理,避免一次性加载整个文件到内存
  • 示例代码片段:
# 分块读取并处理
chunk_iter = pd.read_csv(file_stream, compression='zip', chunksize=100000, usecols=['col1', 'col2', 'col3'])
for chunk in chunk_iter:
    # 处理当前块的逻辑(如清洗、写入数据库等)
    process_chunk(chunk)

方案4:调整服务主体令牌有效期(备选,需AD权限)

如果使用的是服务主体而非托管身份,可在Azure AD中调整其令牌有效期(最长支持24小时):

  1. 登录Azure门户,进入Azure Active Directory → 应用注册
  2. 找到你的服务主体,进入令牌配置 → 添加可选声明
  3. 选择访问令牌,添加exp声明,设置自定义有效期(如6小时)
  4. 保存配置后,重新运行任务

注意:托管身份无法自定义令牌有效期,此方法仅适用于服务主体,且需要AD管理员权限。


内容的提问来源于stack exchange,提问作者Dan Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:36