【问题标题】:Nifi List File from multiple paths and route them to their respective destinations来自多个路径的 Nifi 列表文件并将它们路由到各自的目的地
【发布时间】:2018-05-10 15:22:55
【问题描述】:

我在不同的位置有 3 个文件,我使用 3 个列表文件处理器,然后是 fetch 文件处理器。现在我想将这些文件路由到它们各自的目的地,这对于所有 3 个文件都是不同的。需要一些关于如何做到这一点的帮助。

谢谢

【问题讨论】:

  • 目的地是固定的吗?如果不是,您如何决定哪个流文件应该放在哪里?
  • 是的,目的地是固定的,比如名为 abc 的文件必须进入 i/j/z,而名为 def 的文件必须进入路径 i/j/k

标签: hdfs apache-nifi


【解决方案1】:

根据您上面提到的路由逻辑,您可以将流程设置为:

ListFile(s) -> FetchFile(s) -> RouteOnAttribute -> PutFile(s)

RouteOnAttribute,您可以使用 NiFi 表达式语言支持。例如,您可以拥有三个属性:

destination.one : ${filename:startsWith('abc')}
destination.two : ${filename:startsWith('def')}
destination.three : ${filename:startsWith('xyz')}

说明

您将有三个ListFile 处理器连接到三个FetchFile 处理器。然后将所有三个处理器的Success输出连接到RouteOnAttribute,定义好上述三个关系后,就可以将这三个关系连接到相关的PutFile处理器上。

在上面的示例中,RouteOnAttribute 将名称以 abc 开头的文件路由到关系 destination.one,以 def 开头的文件名路由到 destination.two 等等。

【讨论】:

  • 这个解决方案工作.. 可以使用单放文件处理器
【解决方案2】:

您可以使用简单的 if else 语句并在流文件属性上设置目标,这样您就可以在单处理器中执行相同的操作。您可以通过单个处理器上的线程数进一步调整它们以获得干净的布局。 PFB 示例假设 hostname1 将文件放入 hostnameX/path1 并且 hostname2 将文件放入 hostnameY/path2 :

putfile 路径的新属性 = ${sftp.remote.hostname:equals('hostname1'):ifElse('hostnameX/path1','hostnameY/path2')}

如果有 n 个主机名及其对应的目的地,您可以进一步嵌套 ifElse,并使用您的新属性作为目的地。

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2017-06-12
    • 2020-11-09
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多