新来的尼菲!
我想知道 nifi 中是否有一种方法可以使用诸如“PutFile”之类的处理器并将其写入一个文件(将数据附加到该文件,或覆盖该文件中的数据) - 而不是创建多个不同的文件?我需要使用另一个处理器来完成此操作吗?
新来的尼菲!
我想知道 nifi 中是否有一种方法可以使用诸如“PutFile”之类的处理器并将其写入一个文件(将数据附加到该文件,或覆盖该文件中的数据) - 而不是创建多个不同的文件?我需要使用另一个处理器来完成此操作吗?
对于那些不想覆盖文件中的数据但想附加数据的人。
使用 ExecuteStreamCommand 处理器附加到单个文件:
putFile 处理器无法做到这一点,但您可以使用ExecuteStreamCommand处理器来完成此操作。
在命令参数中放置要记录的属性,由分隔符分隔
${aatr1};${aatr2};${attr3}
在命令路径中放置 bash 脚本的绝对路径:/path/logger.sh
记录器.sh:
#!/bin/bash
echo "$1|$2|$3">> /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);
}
目前无法将数据附加到文件,但您可以使用 PutFile 覆盖文件。
PutFile 处理器使用 FlowFile 上的属性“文件名”将文件写入磁盘。因此,如果您将 UpdateAttribute 处理器放在将所有传入 FlowFile 更新为相同“文件名”的 PutFile 之前,那么 PutFile 处理器将以相同的文件名将它们全部写入磁盘。
要使用 PutFile 执行此操作,请确保将处理器属性“冲突解决策略”配置为“替换”。
对不起。对此很陌生。让我再尝试一次...
LogAttribute 处理器可能是一个选项,因为它似乎提供了最接近文件附加的功能。但它似乎并不理想,因为它提供的指导输出的选项很少。
如果您打算使用“开箱即用”处理器功能而不是开发类来自定义,则可以尝试其他两个选项。使用 ExecuteScript 处理器执行 Jython、Groovy 或 JS 脚本,该脚本修改输出 flowFile 以仅包含您需要的属性。然后使用 PutMongo 或 PutSQL 处理器更新持久数据库资源。
如果您没有可供使用的数据库资源,则另一种选择:使用上面提到的 ExecuteScript 处理器,然后使用 PutFile 将唯一命名的文件名属性输出到目录 - 例如 ${filename}.${uuid}。您最终会得到大量类似格式的文件 - 每个文件一条日志记录 - 然后您可以将它们汇总到一个文件中以使用 Linux 行命令进行分析,或者在您的工作流程中使用最终的 ExecuteScript 处理器来每次汇总通过您的工作流程处理文件。最后一个可能不是一个好主意,因为如果您的 flowFiles 流很高,它是否会引入同步和写入争用问题尚不清楚。
有一种或多种将数据附加到文件的解决方案。我更喜欢 ExecuteGroovyScript 处理器来追加文件。您可以通过 groovy 脚本轻松获取文件。然后如果文件存在,我们可以附加数据。我成功地实现了这个方法。
最初的问题是附加到现有文件。大概的想法是为每个流文件写一行。
您可以使用不同的方法来实现此用例:不是将连续的行附加到文件中,而是在 Nifi 中进行合并,然后一次性写出整个文件。这是通过 MergeContent 处理器完成的。它获取连续流文件的内容,并将它们粘贴到单个流文件中。它有各种配置选项来说明在输出合并结果之前要累积多少个流文件,然后您可以使用 PutFile 将其写出。
这是一个以 CSV 格式将关键属性写入硬编码位置的方法。这对于在清空队列之前归档队列很有用。
假设您要写出属性id
和。name
size
id,name,size
。filename
属性设置为您喜欢的任何内容其他一切都可以保留为默认值。
这个配方需要适应其他情况: