Azure Synapse批量查询ADLS Gen2文件报错误代码12的问题求助
根因说明
这个报错本质是Azure Synapse无服务器池批量访问大量ADLS Gen2文件时,触发了存储端的令牌验证限流或并发连接数上限,并非真实的文件权限问题,所以才会出现单文件访问正常、批量访问随机报错的情况。
解决方案
1. 完善外部数据源配置,显式指定托管身份凭证
你当前的外部数据源未显式绑定托管身份,批量请求时会出现令牌获取竞争,导致随机验证失败,按如下方式修改外部数据源定义:
CREATE DATABASE SCOPED CREDENTIAL ManagedIdentityCred WITH IDENTITY = 'Managed Identity'; CREATE EXTERNAL DATA SOURCE analytics WITH ( location = 'https://<url>.dfs.core.windows.net/analytics', CREDENTIAL = ManagedIdentityCred );
2. 新增文件级错误跳过配置
在OPENROWSET中添加ERRORFILE_DATA_SOURCE和ERRORFILE_LOCATION参数,即可实现文件级错误的自动跳过,不会因为单个文件加载失败中断整个查询:
SELECT Parsed.* FROM OPENROWSET ( bulk '2021/*/**.log', maxerrors = 2147483647, data_source = 'analytics', format = 'csv', fieldterminator ='0x0b', fieldquote = '0x0b', ERRORFILE_DATA_SOURCE = 'analytics', ERRORFILE_LOCATION = 'error_logs/' ) WITH (doc nvarchar(max)) AS Rows CROSS APPLY OPENJSON(Rows.doc) WITH ( col1 NVARCHAR(100), col2 NVARCHAR(100), ..., coln NVARCHAR(MAX) ) AS Parsed
加载失败的文件路径会自动写入你指定的error_logs/目录下,方便后续排查。
3. 拆分查询范围,减少单次查询加载的文件量
不要一次性扫描全量2021年的所有log文件,按月份、日期目录拆分查询,比如先查2021/01/**.log、再查2021/02/**.log,最后合并结果,可大幅降低并发连接的压力。
如果文件路径包含日期等分区信息,可以使用filepath()函数做分区剪枝,进一步过滤不需要加载的文件。
4. 调整ADLS Gen2的限流配置
登录Azure portal查看对应存储账户的监控指标,确认是否存在限流( throttling)事件,如果有可提交支持工单提升存储账户的并发请求配额,或者将存储账户升级到高级性能层。
5. 预创建分区外部表(长期方案)
如果需要经常查询这部分数据,可提前创建分区外部表,按日期、目录做分区,查询时无服务器池会自动走分区剪枝,稳定性比单次OPENROWSET全量扫描高很多。
内容的提问来源于stack exchange,提问作者William Moore
相关产品推荐
相关产品推荐

