Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)

Posted

技术标签:

【中文标题】Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)【英文标题】:Azure Synapse: Cannot bulk load because the file could not be opened. Operating system error code 12(The access code is invalid.) 【发布时间】:2021-10-30 04:25:52 【问题描述】:

我正在使用 Azure Synapse 通过 OPENROWSET 命令 see here 查询大量 CSV 文件。这些文件位于通过托管标识连接到 Azure Synapse 的 Data Lake gen 2 上。

当我一次只查询几个文件时,这工作正常,但是当我增加我试图同时查询的文件数量时,我收到以下错误:

Azure Synapse: Cannot bulk load because the file <file> could not be opened. Operating system error code 12(The access code is invalid.)

这里&lt;file&gt; 每次运行查询时都是一个不同的文件。如果我导航到链接数据视图中的文件,我可以下载并查看该文件。此外,如果我指定对前面提到的文件运行查询,它会正常工作。

我用来查询数据湖的代码如下:

SELECT
            Parsed.*
            FROM OPENROWSET
            (
                bulk '2021/*/**.log',
                maxerrors = 2147483647,
                data_source = 'analytics',
                format = 'csv',
                fieldterminator ='0x0b',
                fieldquote = '0x0b'
            ) WITH (doc nvarchar(max)) AS Rows
            CROSS APPLY OPENJSON(Rows.doc)
            WITH
                (
                    col1 NVARCHAR(100),
                    col2 NVARCHAR(100),
                    ...,
                    coln NVARCHAR(MAX)
                ) AS Parsed

这里是数据源,analytics是一个数据源,指定如下:

    CREATE EXTERNAL DATA SOURCE analytics
        WITH
        (
            location = 'https://<url>.dfs.core.windows.net/analytics'
        )

我尝试为OPENROWSET 中的BULKMAXERRORS 参数指定一个较大的数字,因为我不介意在执行此查询时是否只丢失了几个文件,但这似乎只适用于错误的行级别,这些错误在文件级别。

查询正在内置无服务器池上运行。

任何有关如何解决此问题的想法都将不胜感激。

【问题讨论】:

【参考方案1】:

对于连接到 Synapse 无服务器的任何 AAD 用户(如果您使用 SQL 登录,这将失败),您的代码正在通过身份验证传递给存储。要使用 MSI 连接到存储,您需要一个数据库范围的凭据,并且需要在外部数据源中引用它,如 example 中所示。


-- Optional: Create MASTER KEY if not exists in database:
-- CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Very Strong Password>
CREATE DATABASE SCOPED CREDENTIAL SynapseIdentity
WITH IDENTITY = 'Managed Identity';
GO
CREATE EXTERNAL DATA SOURCE mysample
WITH (    LOCATION   = 'https://<storage_account>.dfs.core.windows.net/<container>/<path>',
          CREDENTIAL = SynapseIdentity
)

如果您已将其锁定,另请参阅该文章中有关存储帐户防火墙的部分。

【讨论】:

【参考方案2】:

只需为此添加一个快速答案。在进行 Greg 建议的更改后,我能够查询更多数据 - 但仍然遇到错误代码 12。

我与 Azure 支持人员进行了交谈,他们告诉我错误消息实际上是 412(但我看不到);所以这个隐含的文件正在使用/正在修改。添加以下内容允许 Azure Synapse 忽略此内容并查询文件:

ROWSET_OPTIONS = '"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'

或者对于外部表:

TABLE_OPTIONS = N'"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'

这是我最后的查询:

SELECT
        Parsed.*
        FROM OPENROWSET
        (
            bulk '2021/*/**.log',
            maxerrors = 2147483647,
            data_source = 'analytics_master_key',
            format = 'csv',
            fieldterminator ='0x0b',
            fieldquote = '0x0b',
            ROWSET_OPTIONS = '"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]'
        ) WITH (doc nvarchar(max)) AS Rows
        CROSS APPLY OPENJSON(Rows.doc)
        WITH
            (
                col1 NVARCHAR(100),
                col2 NVARCHAR(100),
                ...,
                coln NVARCHAR(MAX)
            ) AS Parsed

【讨论】:

以上是关于Azure Synapse:无法批量加载,因为无法打开文件。操作系统错误代码12(访问代码无效。)的主要内容,如果未能解决你的问题,请参考以下文章

Azure blob 到 Azure SQL 数据库:无法批量加载,因为无法打开文件“xxxx.csv”。操作系统错误代码 5(访问被拒绝。)

从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse

Azure Synapse 文件无法打开错误

Azure Synapse 分析:访问外部表时出错

Azure Synapse Studio - 无法创建 SQL 池

SqlServerRegionDoesNotAllowProvisioning:无法创建 Azure Synapse Analytics 工作区