如何在ADF并行源Data Flow中捕获并记录错误
问题背景
- 业务流程:从数据湖读取
manifest.cdm.json文件做数据处理,新增pipeline run id列后写入SQL数据库;已有一份json list file,存储了Data Flow读取所有CDM文件所需的全部源参数。 - 历史方案:用
Foreach循环逐次给单源模式的dataflow传参执行,配套做错误捕获,但该方案下ForEach搭配Data Flow的运行成本过高。 - 当前方案:手动在单个Data Flow里配置所有CDM文件源,但是错误捕获存在明显问题:任意一个源报错就会导致整个Data Flow活动直接失败;如果开启Data Flow活动级别的跳过错误配置,又拿不到任何具体错误信息。
- 核心诉求:在当前架构下实现错误的捕获与记录。
附:配置参考为Azure Data Flow源设置面板界面
可行落地方案
方案一:Data Flow内源级错误路由(适配现有全源配置架构,无额外成本)
不要开活动层面的全局跳过错误,直接在Data Flow内部给每个CDM源单独做错误分流:
- 每个源组件开启
Allow schema drift,同时在源设置里打开Capture errors开关,源读取过程中的格式错误、schema不匹配错误都会自动生成ErrorMessage、ErrorCode、ErrorColumn内置列 - 每个源的输出接一个条件拆分组件:没有错误列值的正常流走原有处理逻辑——新增pipeline run id列、写入业务SQL库;带错误信息的支流统一拼接当前源的标识字段、pipeline run id,写入专门的错误日志SQL表
- 单个源的错误只会进入错误支流,不会阻断其他源的正常处理,整个流程只启动一次Data Flow集群,成本和当前手动配全源的方案完全一致。
方案二:优化ForEach执行逻辑(平衡处理隔离性与成本,替代原有高成本ForEach方案)
原有ForEach方案成本高的核心原因是每次循环都重新启动新的Data Flow集群,做两个配置调整就能把成本降到和单Data Flow接近:
- 关闭ForEach的并行执行,开启
Sequential顺序执行模式 - Data Flow绑定的集成运行时开启
Time to live(TTL),设置为10~15分钟,整个ForEach循环执行期间集群不会重复销毁重建,避免冷启动开销 - 循环内的单源Data Flow活动套一层Try-Catch逻辑:活动成功则走正常写入流程,活动失败则直接把当前循环的源参数、活动返回的错误信息、pipeline run id写入错误日志表,不中断后续循环的源处理。
兜底全局错误捕获
不管选上述哪个方案,都给Data Flow活动添加失败依赖触发的日志活动:当Data Flow出现集群异常、权限错误这类非数据层面的全局错误时,直接读取@activity('你的Data Flow活动名').Error变量里的错误详情,写入全局错误日志表,避免漏记错误。
内容的提问来源于stack exchange,提问作者Suraj Shejal
相关产品推荐
相关产品推荐

