将 Azure 数据工厂上的数据管道从 SQL 服务器复制到 Blob 存储

Copy Data pipeline on Azure Data Factory from SQL Server to Blob Storage

我正在尝试使用 Azure 数据工厂中的“复制数据”管道将一些数据从 Azure SQL 服务器数据库移动到 Azure Blob 存储。特别是,我在管道的 Source 选项卡中使用 ?AdfDynamicRangePartitionCondition 挂钩的“使用查询”选项,如 Microsoft's pattern here 所建议,并且复制操作并行化查询本身使用的分区键的存在。

SQL 服务器数据库上的源代码由两个视图组成,分别具有 ~300k 和 ~3M 行。 此外,视图具有相同的查询结构,例如(伪代码)

with 
    v as (
        select hashbyte(field1) [Key1], hashbyte(field2) [Key2]
        from Table
    )
    select * 
    from v

视图查询的表也是如此。最重要的是,视图查询相同数量的分区,行数分布大致相同。

复制操作的意外行为(很可能是由于我这边缺乏经验)是查询较少行的视图持续时间更长。事实上,具有 ~300k 行的复制操作显示的吞吐量为 ~800 KB/s,而具有 ~3M 行的复制操作显示的吞吐量为 ~15MB/s (!)。最后,对于这两种情况,对 blob 存储的写入操作都非常快,这与从源读取操作相反。

我不希望任何人提供实际的解决方案——因为所提供的信息有限——但我更希望得到一些提示,说明在视图查询的情况下,什么会严重影响复制性能考虑到视图下的表具有相当数量的字段以及相同的数据类型,更少(大约一个数量级)的行数:视图查询包含的两个表 intdatetimevarchar 数据类型。

提前感谢您的提醒。

当 ADF 中存在副本 activity 性能问题且根本原因不明显时(例如,如果源速度很快,但接收器受到限制,我们知道原因)——我将如何处理它:

  1. 从集成运行时 (IR) (doc.) 开始。这可能是作业的并发问题、网络吞吐量问题,或者只是 VM 容量不足(在自托管的情况下)。比如,我的产品 ETL 中 >80% 的所有问题都是由 IR-s 以某种方式引起的。
  2. 在源和接收器上复制复制 activity 行为。从本地机器查询视图(理想情况下,从与 IR 处于相同环境中的虚拟机),将平面文件写入 blob 等。我假设你已经这样做了,但再进行一次观察很少有坏处。
  3. 测试副本的各种配置activity。更改 isolationLevelpartitionOptionparallelCopiesenableStaging 将是我在这里的第一步。显然,这不会解决问题的根本原因,但可以为您指明进一步深入研究的方向。
  4. 尝试搜索文档(这 doc., provided by @Leon 是一个好的开始)。这应该是第 1 步,但是,我发现 ADF 文档有些欠缺。

N.B. 这是基于我个人使用数据工厂的经验。
在这种情况下提供具体的解决方案确实非常困难。

对于可能偶然发现相同问题的人,我根据经验设法发现瓶颈是由 SQL DB 上的视图中存在多个密钥哈希计算引起的。事实上,一旦我删除了这些 - 稍后在 Azure Synapse Analytics(数据仓库)上计算 - 我观察到复制操作的性能大幅提升。