3. Azure Data Factory性能调优

Azure Data Factory(ADF)的性能问题很少来自单一配置项,而是“并行度、分区、DIU、集成运行时、数据流执行引擎、监控判读”共同作用的结果。调优的基本思路是:先通过监控定位瓶颈发生在读取端、写入端、计算端还是调度端,再针对瓶颈调整对应参数,而不是一次性把所有参数拉满。下面按复制活动、自托管集成运行时、映射数据流和监控指标四条主线展开。

一、复制活动:并行复制与分区策略

复制活动的吞吐由“并行副本数 × 单副本吞吐”决定。在“复制活动 → 设置 → 并行度”中,可以显式指定并行副本数(DIU 与并行度配合使用);若留空,ADF 会根据源/接收器类型自动决定。并行复制的前提是数据可以被切分,因此分区策略是关键。

以从 Azure SQL Database 复制 2 亿行订单表到 ADLS Gen2 为例,常见分区方式有三种:

  • 物理分区:源表已有分区列(如 OrderDate),按日期范围切分,每个副本读取一个区间。
  • 动态范围分区:ADF 先执行 SELECT MIN/MAX 获取边界,再按 N 等分生成分区查询,适合无物理分区的大表。
  • 基于列表分区:按枚举值(如 RegionID IN (1,2,3))切分,适合维度表或分布不均的数据。

分区列应满足“分布均匀、可下推、有索引”三个条件。若分区列倾斜严重(例如 80% 数据集中在某一天),并行副本会出现长尾,整体耗时由最慢副本决定。此时应改用更细粒度的分区列,或对倾斜区间单独拆分。

二、DIU 设置与自托管集成运行时扩展

DIU(Data Integration Unit)是复制活动的计算资源单位,1 DIU ≈ 1 核 CPU + 4 GB 内存的组合度量。DIU 越高,单副本吞吐越强,但并非线性增长。经验上,从 4 DIU 提升到 16 DIU 通常有明显收益,超过 32 DIU 后边际收益递减,且受源/接收器端吞吐上限约束。

当数据源位于本地或受防火墙保护的网络内时,需使用自托管集成运行时(SHIR)。SHIR 的扩展方式有两种:

  • 纵向扩展:提升单节点 CPU/内存,适合单副本大吞吐场景。
  • 横向扩展:部署多个 SHIR 节点并加入同一逻辑实例,ADF 会自动在节点间分发并行副本。通常 4 节点、每节点 8 核是较均衡的起点。

SHIR 节点数应不小于并行副本数,否则副本会排队等待节点资源。同时需关注 SHIR 所在机器的网络带宽与磁盘 IO,它们常成为隐性瓶颈。

三、映射数据流优化

映射数据流运行在 Spark 集群上,调优重点是分区与执行模式。数据流中的“优化”选项卡可设置分区方式:

  • Round Robin:均匀分布,适合无关联的转换。
  • Hash:按连接键分区,减少 shuffle,适合 join/aggregate。
  • Fixed:固定分区数,适合已知数据量。
  • Key:按唯一键分区,适合去重。

此外,应尽量使用“单阶段”转换替代多阶段链式转换,减少 shuffle 次数;对广播连接(小表 join 大表)启用 Broadcast 优化;在接收器端控制输出文件数量,避免小文件过多导致下游读取变慢。

ADF 数据集成管道性能调优关键路径 源数据 SQL DB / 本地库 2 亿行订单表 分区策略 物理分区 / 动态范围 列表分区 分区列需均匀、可下推 并行复制 并行副本数 N DIU 4 → 16 → 32 N ≤ SHIR 节点数 接收器 ADLS Gen2 Parquet / 分区目录 自托管集成运行时(SHIR) 纵向扩展:单节点 CPU / 内存 横向扩展:多节点加入同一逻辑实例,自动分发副本 节点数 ≥ 并行副本数,关注网络带宽与磁盘 IO 映射数据流优化 • 分区方式:Round Robin / Hash / Fixed / Key • 减少 shuffle:合并转换阶段 • 小表 join 大表:启用 Broadcast • 接收器控制输出文件数量,避免小文件 监控指标判读 • 复制活动:DIU 使用率、吞吐、读写耗时 • 数据流:Spark 阶段耗时、shuffle 量 • SHIR:节点 CPU / 内存 / 队列长度 • 长尾副本 → 检查分区倾斜 反馈调优

四、监控指标解读与调优闭环

ADF 监控提供复制活动的“DIU 使用率”“读取耗时”“写入耗时”“吞吐量”等指标。判读逻辑如下:

  • 若 DIU 使用率高但吞吐低,说明计算不是瓶颈,应检查源/接收器端限流或网络带宽。
  • 若 读取耗时远大于写入耗时,瓶颈在源端,可尝试提高并行度或优化源查询。
  • 若 各副本耗时差异大,说明分区倾斜,需重新选择分区列。
  • 若 SHIR 节点 CPU 饱和,应增加节点或提升单节点规格。

数据流方面,重点看 Spark 各阶段耗时与 shuffle 数据量。若 shuffle 量异常大,通常意味着 join 或 aggregate 的分区键选择不当,应改用 Hash 分区并确保连接键一致。

调优建议按“先定位瓶颈,再调整参数,最后验证”的顺序进行。每次只改一个变量,记录前后指标,避免多变量同时变化导致无法归因。

五、参数配置参考示例

以下为从 Azure SQL Database 复制大表到 ADLS Gen2 的参考配置(示例参数,需根据实际环境调整):

复制活动设置:
  并行度(并行副本数):8
  DIU:16
  分区方式:动态范围分区
  分区列:OrderDate
  分区数:8

SHIR 配置:
  节点数:4
  每节点:8 核 / 32 GB
  网络带宽:≥ 1 Gbps

映射数据流:
  分区方式:Hash
  分区键:CustomerID
  广播阈值:≤ 100 MB
  输出文件数:每分区 1 个

按上述配置,若源端可支撑,2 亿行订单表的复制耗时可从单副本的约 40 分钟降至 8~12 分钟量级(示例估算,实际取决于源端吞吐、网络和接收器写入能力)。调优后应再次查看监控,确认各副本耗时接近、DIU 使用率合理、无长尾副本,才算完成闭环。

不要盲目将 DIU 和并行度同时拉满。DIU 过高会增加成本,并行度过高可能压垮源库或 SHIR 节点,反而导致重试和超时。建议从中间值开始,逐步上调并观察指标。