ADF写入不同目标目录时其他管道读源报路径不存在故障
问题产生原因
- 共享数据集运行时上下文冲突:你当前写入、读取管道共用同一个Blob存储数据集,且数据集的目录动态值直接写死了
@pipeline().TriggerTime这类和单管道运行强绑定的表达式,没有做参数化隔离。ADF的共享数据集在被多个管道并发调用时,运行时上下文会被最先启动的管道(也就是正在运行的写入管道)抢占,其他读取管道调用这个数据集时,拿不到自己传入的旧目录参数,会被错误指向写入管道正在使用的新目录——这个新目录下还没生成正式的JSON文件,只有写入过程中的临时文件,自然会报找不到文件的错误。你手动核实存在的是旧目录,但读取任务实际运行时根本没访问到那个路径。 - 临时文件枚举逻辑缺陷:ADF Copy活动往Blob写JSON文件时,会先生成
.tmp、.pending后缀的临时块文件,整个任务跑完才会重命名为正式的.json文件,写入过程中这些临时文件对外是不可读的。如果你的读取任务开了递归枚举,或者通配符匹配范围覆盖到了正在写入的目录,Blob连接器扫到这些读不了的临时文件时,不会自动跳过,直接抛出路径解析失败的错误,哪怕你要读的旧目录下的文件全是正常的。
解决方案
- 隔离数据集参数,避免上下文抢占
绝对不要把@pipeline().TriggerTime这类属于单管道运行上下文的表达式直接写在共享数据集的配置里。给Blob数据集加一个字符串类型的参数,比如叫TargetFolder,把数据集的目录路径配置成@dataset().TargetFolder。不管是写入还是读取管道,用这个数据集的时候都在活动配置页手动给这个参数传值:写数据的时候传当前触发时间拼出来的目录,读数据的时候传自己要读的旧目录路径,各传各的互不干扰。如果读写两边的配置差异大,干脆直接建两个独立的Blob数据集分别给写入、读取管道用,彻底杜绝上下文抢用的问题。 - 分开存储临时文件,给读取任务加过滤规则
在写入Copy活动的接收器设置里找到临时文件配置项,专门指定一个和业务数据完全不相关的路径存临时块,比如adf_temp/copy_staging,别让临时文件落在业务目录里,同时开启任务跑完自动删除临时文件的开关。
读数据的活动源配置里加排除规则,用通配符**/*.tmp、**/*.pending把所有写入过程产生的临时文件全过滤掉,不让连接器扫到这些读不了的文件。 - 给读取任务开启容错
在读取活动的设置里打开「跳过不存在的文件」选项,如果用的是映射数据流读数据,同步开启Allow no files found开关,把单文件访问失败的处理逻辑改成跳过而不是直接让整个任务失败,避免个别异常文件拖垮整个作业。 - (可选)如果业务上不要求读写同时跑,可以在读管道最前面加个Web活动,查询写入管道的运行状态,等写入完全跑完再启动读任务,从流程上绕开并发冲突。
内容的提问来源于stack exchange,提问作者Samaneh Rajabi
相关产品推荐
相关产品推荐

