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小时):
- 登录Azure门户,进入Azure Active Directory → 应用注册
- 找到你的服务主体,进入令牌配置 → 添加可选声明
- 选择访问令牌,添加
exp声明,设置自定义有效期(如6小时) - 保存配置后,重新运行任务
注意:托管身份无法自定义令牌有效期,此方法仅适用于服务主体,且需要AD管理员权限。
内容的提问来源于stack exchange,提问作者Dan Wang
相关产品推荐
相关产品推荐

