NiFi新手求助:GetMongo处理器重复返回相同MongoDB查询结果
作为刚接触NiFi的新手,碰到这种重复获取相同文档的情况真的挺闹心的,我来帮你梳理下几个最可能的原因和对应的解决办法:
检查
Query Strategy配置(最常见原因)
GetMongo默认的查询策略是Query All,这意味着每次处理器触发运行时,都会完整执行你设置的查询语句,把所有符合条件的文档都拉一遍——哪怕这些文档已经被处理过了。你需要把这个配置项改成Incremental Query,这样NiFi会自动跟踪已经处理过的文档,避免重复抓取。配置增量查询的跟踪字段
切换到增量查询后,得指定一个有序且唯一的字段来让NiFi记住最后处理到哪了。比如MongoDB自带的_id字段就很合适(它本身是有序生成的),或者你如果有记录创建时间的字段也可以用。在配置里找到Incremental Field Name,填入你选的字段名,再把Incremental Field Type设为对应的类型(比如_id就选ObjectId)。确认查询语句的正确性
虽然你说在MongoDB里执行{"qty":{$gt:10}}只有2条结果,但要确保在GetMongo的Query配置框里输入的语法完全正确——JSON格式容不得半点马虎,比如多余的空格、引号不配对都会导致问题。建议先在MongoDB Shell里跑一遍查询确认结果数,再把正确的语句复制到NiFi里。检查处理器的调度和下游流程
如果你的处理器调度频率太高,或者下游处理器出现阻塞(比如队列满了、处理失败),可能会导致GetMongo反复触发查询。可以先把调度频率调低一点,或者检查下游流程是否能正常处理文档,确保每个文档都能被顺利消费掉。确保开启了状态存储
增量查询需要NiFi存储“最后处理到哪个文档”的状态,所以要检查处理器的State Management配置,把Store State设为LOCAL(单节点部署)或者CLUSTER(集群部署)。要是没开状态存储,NiFi每次重启或者触发时都记不住之前处理过什么,自然会重复拉取。
内容的提问来源于stack exchange,提问作者Ankit Juneja

