Nifi:如何避免复制部分写入的文件
Nifi: how to avoid copying file that are partially written
我正在尝试使用 Nifi 从 SFTP 服务器获取文件。文件可能很大,所以我的问题是如何避免在写入文件时获取文件。我计划使用 ListSFTP+FetchSFTP,但如果可以避免复制部分写入的文件,也可以使用 GetSFTP。
谢谢
如果您可以控制写入文件的进程,解决此问题的常见模式是最初写入具有特定命名结构的文件,例如以 .
开头。写入操作成功后,文件在没有 .
的情况下被重命名,并由处理器拾取。 GetSFTP
和 ListSFTP
都有一个名为 Ignore Dotted Files 的处理器 属性,默认设置为 true
,这意味着这些处理器将不对或 return 以点字符开头的文件进行操作。
除了 Andy 的可靠答案之外,您还可以通过使用 ListSFTP/FetchSFTP 处理器对进行一些基于元数据的路由来更加灵活。
在 ListSFTP 之后,每个流文件都将具有 'file.lastModifiedTime' 等属性。你可以在这里阅读它们 https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.3.0/org.apache.nifi.processors.standard.ListSFTP/index.html
您可以在 List 和 Fetch 之间放置一个 RouteOnAttribute 进程来检测至少根据报告的最后 mod 化时间为 'too new' 的对象。您可以将它们路由到一个处理器,该处理器只是一个缓慢的通道,有意等待一下。然后,您可以 运行 那些通过第一个路由器返回,直到它们 'old enough'。现在,这无疑是一种高级用户方法,但它确实为您提供了很大的灵活性和控制力。我在这里提到的方法并不是万无一失的,因为源系统可能没有正确报告最后的 mod 时间,这可能并不意味着正在编写源文件等。但是它为您提供了其他选项 IF你不能做上面安迪所说的绝对正确的事情。
我正在尝试使用 Nifi 从 SFTP 服务器获取文件。文件可能很大,所以我的问题是如何避免在写入文件时获取文件。我计划使用 ListSFTP+FetchSFTP,但如果可以避免复制部分写入的文件,也可以使用 GetSFTP。
谢谢
如果您可以控制写入文件的进程,解决此问题的常见模式是最初写入具有特定命名结构的文件,例如以 .
开头。写入操作成功后,文件在没有 .
的情况下被重命名,并由处理器拾取。 GetSFTP
和 ListSFTP
都有一个名为 Ignore Dotted Files 的处理器 属性,默认设置为 true
,这意味着这些处理器将不对或 return 以点字符开头的文件进行操作。
除了 Andy 的可靠答案之外,您还可以通过使用 ListSFTP/FetchSFTP 处理器对进行一些基于元数据的路由来更加灵活。
在 ListSFTP 之后,每个流文件都将具有 'file.lastModifiedTime' 等属性。你可以在这里阅读它们 https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.3.0/org.apache.nifi.processors.standard.ListSFTP/index.html
您可以在 List 和 Fetch 之间放置一个 RouteOnAttribute 进程来检测至少根据报告的最后 mod 化时间为 'too new' 的对象。您可以将它们路由到一个处理器,该处理器只是一个缓慢的通道,有意等待一下。然后,您可以 运行 那些通过第一个路由器返回,直到它们 'old enough'。现在,这无疑是一种高级用户方法,但它确实为您提供了很大的灵活性和控制力。我在这里提到的方法并不是万无一失的,因为源系统可能没有正确报告最后的 mod 时间,这可能并不意味着正在编写源文件等。但是它为您提供了其他选项 IF你不能做上面安迪所说的绝对正确的事情。