我正在尝试使用Nifi从SFTP服务器获取文件。文件可能很大,所以我的问题是如何避免在编写文件时获取文件。我打算使用ListSFTP + FetchSFTP,但如果可以避免复制部分写入的文件,也可以使用GetSFTP。
谢谢
答案 0 :(得分:3)
如果您可以控制写入文件的进程,解决此问题的常见模式是首先使用特定的命名结构编写文件,例如以.
开头。成功写入操作后,文件将在没有.
的情况下重命名,并由处理器拾取。 GetSFTP
和ListSFTP
都有一个名为忽略虚线文件的处理器属性,默认设置为true
,表示这些处理器无法操作或返回文件开头用点字符。
答案 1 :(得分:3)
除了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流程,以检测至少基于报告的上次修改时间的对象是否太新了#39;你可以将它们路由到一个只是慢速通过的处理器,故意稍等一下。然后,您可以通过第一个路由器运行这些路由器直到它们足够老了#39;现在,这无疑是一种高级用户方法,但它确实为您提供了很多灵活性和控制力。我在这里提到的方法并不是万无一失的,因为源系统可能无法正确报告上一个模式时间,这可能并不意味着源文件正在写入等等。但它会为您提供额外的选项,如果您不能做上面Andy谈到的绝对正确的事情。