在GenerateTableFetch处理器中手动设置“组件状态”

问题描述

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

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

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

解决方法

StateManager仅授予组件修改其自身状态的权限,而不授予其他组件的状态,否则任何组件都可能错误地更改另一个组件的状态。

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

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

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

如果要在独立实例之间迁移,则只需将状态/本地从原始集群复制到新集群。