Azure Synapse无服务器CETAS创建外部表间歇性IO错误(0x00000057)求助
问题描述
我在Azure数据工厂(Azure Data Factory)中运行管道,针对附加到Azure Synapse无服务器数据库的存储账户数据湖里的.parquet文件执行SQL查询,通过CETAS(CREATE EXTERNAL TABLE AS)语句创建新外部表,使用的查询语句如下:
IF OBJECT_ID('DatabaseName.tmp.TableName') IS NOT NULL DROP EXTERNAL TABLE DatabaseName.tmp.TableName; CREATE EXTERNAL TABLE DatabaseName.tmp.TableName WITH ( LOCATION = 'space=tmp/table=TableName/', DATA_SOURCE = myDataSource, FILE_FORMAT = myFileFormat (parquet) ) AS SELECT * FROM DatabaseName.dbo.TableName;
执行管道时,有50%的概率出现如下错误:
Operation on target Creat TMP Table failed: Error handling external file: 'IO request completed with an error. ERROR = 0x00000057'. Underlying data description: table 'DatabaseName.dbo.TableName'
重新运行管道即可成功,但间隔一段时间后再次运行又会触发该错误,需要排查故障原因。
故障原因分析
- 存储账户IO并发冲突:CETAS操作写入目标存储路径时,若之前的DROP EXTERNAL TABLE操作未完全释放路径锁,或有其他并发读写任务访问同一位置,会触发IO错误。Synapse无服务器对外部表元数据和存储路径的处理存在短暂延迟,DROP与CREATE操作间隔过短,极易引发资源竞争。
- 元数据缓存不一致:Synapse无服务器会缓存外部表的元数据,DROP表后缓存可能未及时失效。当后续执行CREATE操作时,缓存的旧元数据与实际存储状态不匹配,引发IO处理错误。这种缓存不一致是间歇性的,因此错误概率约为50%。
- 存储账户临时IO故障:Azure存储账户偶尔会出现短暂的IO性能波动或内部错误(错误码0x00000057对应参数无效或IO请求格式错误),尤其是在高负载时段。这类临时故障属于偶发情况,重新运行时负载降低即可成功。
- CETAS写入的文件命名冲突:CETAS在写入.parquet文件时会自动生成临时文件,若之前的操作残留了未清理的临时文件,或生成的文件名与现有文件冲突,可能导致IO错误。这种情况在重复操作同一路径时容易间歇性触发。
内容的提问来源于stack exchange,提问作者Oleh
相关产品推荐
相关产品推荐

