如何重新运行ADF管道中未获取数据的迭代任务?
问题背景
我有一个ADF父管道,调用包含DataFlow的子管道,实现从Kusto(ADX)查询数据并导出到ADLSv2的功能。由于数据集规模过大,目前只能通过4分区处理的方式正常运行,但遇到了以下问题:
- 个别分区运行时无法获取数据,但手动在Kusto执行相同查询能正常返回结果
- ADF没有抛出任何错误,导致内置重试机制无法触发
- 已通过将ADF元数据 ingest到Kusto监控确认问题:有数据的任务会返回带记录数的metrics,无数据的任务metrics为空
数据流的写入顺序说明:
- 查询结果用于后续数据源(对应写入顺序3)
- 虚拟源,用于查看查询语句(即使运行失败也能保留语句)
- 实际导出数据的获取与写入环节
解决思路与方案
1. 主动检测空结果并触发重试
直接在DataFlow的实际数据输出环节(写入顺序3)添加空记录判断逻辑:
- 用
rowCount()函数统计输出记录数,当结果为0时抛出自定义错误
操作步骤:在数据流里添加「条件分支」,判断rowCount() == 0时,调用error("Partition returned empty result set") - 给子管道配置重试策略,把自定义错误纳入重试触发条件,让空数据场景自动触发重试
2. 优化Kusto分区查询的可靠性
- 检查分区键的分布是否均匀,避免某分区查询时因Kusto资源调度优先级低导致无返回
可在Kusto中执行分区查询时添加set querytrace;,查看查询执行轨迹,确认是否存在资源等待或扫描异常 - 给Kusto源查询添加超时参数:在ADF DataFlow的Kusto源查询开头加上
set query_timeout=5min;,避免因查询超时静默无输出 - 启用Kusto侧的查询重试,或在ADF的Kusto源配置里开启重试选项
3. 完善监控告警机制
- 基于ADF管道的metrics配置自定义告警:当某个分区任务的记录数指标为空时,直接触发邮件或Teams告警,无需人工排查
- 在数据流中添加日志输出:把每个分区的查询语句、执行时间、记录数写入Kusto监控表,方便快速定位空数据的触发场景
内容的提问来源于stack exchange,提问作者Guilherme Matheus
相关产品推荐
相关产品推荐

