首页 > 解决方案 > 在 GenerateTableFetch 处理器中手动设置“组件状态”

问题描述

我在 GenerateTableFetch 处理器中使用“组件状态”来确保不会从数据库中两次查询相同的数据。由于迁移,必须再次部署流,在此过程中丢失其状态。如何手动设置此处理器的“组件状态”?我尝试独立使用 ExecuteScript 处理器(使用 ECMAScript)来更新状态。起初我试图用

var Scope = Java.type('org.apache.nifi.components.state.Scope');
var map = context.stateManager.getState(Scope.LOCAL).toMap();

但我没有得到一个可循环的地图。我不明白的是我如何选择 GenerateTableFetch 处理器来设置状态。

标签: javascriptecmascript-6apache-nifi

解决方案


StateManager 只允许一个组件修改它自己的状态,而不是另一个组件的状态,否则任何组件都可能错误地改变另一个组件的状态。

在幕后,使用组件的 UUID 存储状态。如果您在集群中,则它存储在 ZooKeeper 中,您可以使用 ZK CLI 手动修改 ZooKeeper 中的数据。如果您处于独立状态,则它存储在状态/本地的预写日志中,我不确定是否有手动修改它的好方法。

此外,当将流迁移到新集群时,首选机制是使用 nifi 工具包中的 ZK 状态迁移器:

https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#zookeeper_migrator

如果您在独立实例之间迁移,那么只需将 state/local 从原始集群复制到新集群。


推荐阅读