NiFi多路径文件列表及分路径路由至对应目标的实现咨询
解决NiFi多来源文件路由到不同目标的方案
嘿,我来给你分享几个在NiFi里实现这个需求的实用方法,都是日常运维中常用的思路,你可以根据自己的场景选最适合的:
方案一:用RouteOnAttribute标记路由(最通用)
这是最直观的方式,核心思路是给不同来源的FlowFile打上专属标记,再根据标记分路:
- 第一步:给每个List File + Fetch File的流程链添加
UpdateAttribute处理器
比如第一个来源的链里,给UpdateAttribute设置属性file_origin=source_1,第二个设file_origin=source_2,第三个设file_origin=source_3——这样每个来源的文件都带上了唯一标识。 - 第二步:用
Funnel处理器汇总三个Fetch File的输出
把三个Fetch File的成功连接都接到Funnel,这样所有FlowFile会汇聚到一个流里,后续处理更整洁。 - 第三步:配置
RouteOnAttribute处理器
在这个处理器里添加三个路由规则:- 规则名称:
Route_to_Target_1,匹配表达式:${file_origin:equals('source_1')} - 规则名称:
Route_to_Target_2,匹配表达式:${file_origin:equals('source_2')} - 规则名称:
Route_to_Target_3,匹配表达式:${file_origin:equals('source_3')}
- 规则名称:
- 第四步:把每个路由分支连到对应的目标处理器(比如
PutFile),分别设置各自的目标目录就完成了。
方案二:直接用来源目录属性路由(更简洁)
如果你的三个文件来源目录本身就是固定且唯一的,那可以省掉UpdateAttribute的步骤,直接用List File自带的属性:
- 每个List File处理器会自动给FlowFile添加
source.directory属性,值就是你配置的监听目录。 - 直接把三个Fetch File的输出汇总到RouteOnAttribute,然后用目录作为匹配条件:
比如第一个路由规则的表达式是${source.directory:equals('/data/source_a')},第二个是${source.directory:equals('/data/source_b')},以此类推。 - 后续同样连接到各自的PutFile目标即可。
方案三:根据文件内容路由(按需选择)
如果你的文件需要根据内容来区分(比如不同的业务标识),那可以用RouteOnContent处理器:
- 把所有Fetch File的输出汇总后接到RouteOnContent。
- 给每个目标添加内容匹配规则:比如第一个规则设置“包含字符串‘ORDER_TYPE_A’”,第二个设置“包含字符串‘ORDER_TYPE_B’”,第三个对应剩下的内容或者另一个标识。
- 每个匹配规则对应一个路由分支,连到对应的目标位置。
小提示
- 记得给处理器设置合理的
Concurrent Tasks数值,根据你的文件量调整,避免处理瓶颈。 - 如果有需要,可以在路由前加
LogAttribute处理器,打印FlowFile的属性,确认标记或者目录属性是否正确,方便排查问题。 - 要是担心有未匹配的文件,可以在RouteOnAttribute里开启
Default Route,把不符合规则的FlowFile引导到错误处理流程里。
内容的提问来源于stack exchange,提问作者Adithya Sajjanam
相关产品推荐
相关产品推荐

