PutFile 追加文件

PutFile append file

Nifi 新手!

我想知道 nifi 中是否有一种方法可以使用 "PutFile" 之类的处理器并将其写入一个文件(将数据附加到此文件,或覆盖此文件中的数据)文件) - 而不是创建多个不同的文件?我是否需要使用其他处理器才能完成此操作?

目前无法将数据附加到文件,但您可以使用 PutFile 覆盖文件。

PutFile 处理器使用 FlowFile 上的属性 "filename" 将文件写入磁盘。因此,如果您将 UpdateAttribute 处理器放在 PutFile 之前,将所有传入的 FlowFile 更新为相同的 "filename",那么 PutFile 处理器将使用相同的文件名将它们全部写入磁盘。

要使用 PutFile 执行此操作,请确保将处理器 属性 "Conflict Resolution Strategy" 配置为 "Replace"。

对不起。对此很陌生。让我再试一次...

LogAttribute 处理器可能是一个选项,因为它似乎提供了最接近文件追加的功能。但它似乎并不理想,因为它提供的引导输出的选项很少。

如果您打算使用 "out of the box" 处理器功能而不是开发 类 进行自定义,则可以尝试其他两个选项。使用 ExecuteScript 处理器执行 Jython、Groovy 或 JS 脚本,修改输出 flowFile 以仅包含您需要的属性。然后使用 PutMongo 或 PutSQL 处理器更新持久数据库资源。

如果您没有可供使用的数据库资源,另一种选择是:使用上面提到的 ExecuteScript 处理器,然后是将唯一命名的文件名属性输出到目录的 PutFile - 比如 ${filename}.$ {uuid}。您最终会得到大量格式相似的文件——每个文件一个日志记录——然后您可以将这些文件汇总到一个文件中以使用 Linux 行命令进行分析,或者在您的工作流程中使用最终的 ExecuteScript 处理器来每次通过您的工作流程处理文件时汇总。最后一个可能不是一个好主意,因为不清楚如果你的流文件流很高,它是否会引入同步和写入争用问题。

对于那些不想覆盖文件中的数据但想追加数据的人

使用 ExecuteStreamCommand 处理器附加到单个文件:

putFile 处理器无法实现,但您可以使用 ExecuteStreamCommand 处理器来完成此操作。

在命令参数中放置你想要记录的属性,用分隔符分隔 ${aatr1};${aatr2};${attr3}

在命令路径中放置bash脚本的绝对路径:/path/logger.sh

logger.sh:

#!/bin/bash
echo "||">> /path/attributes.log

attibutres.log 将逐行追加三个属性。确保 bash 脚本可以用 nifi 执行。

做一个chmod 777 logger.sh

使用 ExecuteScript 处理器追加到单个文件:

试试这个 ECMAscript:

var flowFile = session.get();
var File = Java.type("java.io.RandomAccessFile");
if (flowFile != null) {
    var filename = flowFile.getAttribute("filename");
    /// write to file
    var filePath = "/path/attributes.log" ;
    flowFile = session.putAttribute(flowFile, "filePath", filePath);
     var file = new File(filePath, "rws");
     file.seek(file.length());
        file.write(filename.getBytes());
        file.write("\n".getBytes());
        file.close();
    // Finish by transferring the FlowFile to an output relationship
    session.transfer(flowFile, REL_SUCCESS);
}

有一种或多种将数据附加到文件的解决方案。我更喜欢文件 appending.you 的 ExecuteGroovyScript 处理器可以轻松地通过 groovy 脚本获取文件。然后如果文件存在我们可以附加数据。这个方法我成功实现了。

最初的问题是追加到现有文件。大概的想法是为每个流文件写一行。

您可以使用不同的方法实现此用例:不是将连续的行附加到文件中,而是在 Nifi 中进行合并,然后一次性写出整个文件。这是通过 MergeContent 处理器完成的。它获取连续流文件的内容,并将它们粘贴到一个流文件中。它有各种配置选项来说明在吐出合并结果之前你想要积累多少流文件,然后你可以使用 PutFile 写出。

这是一个将关键属性以 CSV 格式写入硬编码位置的方法。 用例:在清空 queue.

之前归档流文件属性

假设您要写出属性 idnamesize

  • 添加处理器 AttributesToCSV。将“属性列表”设置为 id,name,size.
  • 将“目标”设置为“flowfile-content”。
  • 将其下游连接到 MergeContent。
  • 设置“Minimum/Maximum 条目数”,使您的整个 queue 适合一个容器(例如分别为 1 和一些较大的数字)
  • 将“分隔符策略”设置为“文本”
  • 将“分界符”设置为换行符(键入+,或粘贴到换行符中)
  • 在“Header”中设置适当的 CSV header 例如"ID,Name,Size" 并添加尾随换行符
  • 将“Max bin age”设置为几秒 - 足够长以使其有时间合并所有内容,但也足够短以让您乐于等待。
  • 将其下游连接到 UpdateAttribute,将 filename 属性设置为您喜欢的任何值
  • 将下游连接到 PutFile,设置“目录”属性

其他一切都可以保持默认。

此配方需要针对其他用例进行调整:

  • 如果有一个恒定的流程需要写出来:按条目数分成多个箱子,并使文件名动态 - 例如UpdateAttribute 可以设置 filename${UUID().csv}
  • 如果需要 CSV 以外的其他格式:用其他处理器替换 AttributesToCSV