【问题标题】:The Apache Nifi state is not persisted to zookeeperApache Nifi 状态不会持久保存到 zookeeper
【发布时间】:2021-06-03 10:03:27
【问题描述】:

根据官方Nifi documentation,该状态允许 Nifi 处理器“在 NiFi 重新启动后从中断的地方恢复。此外,它允许处理器 存储一些信息 以便处理器可以从集群中的所有不同节点访问该信息”。

如果我的理解不错的话,当我们配置一个zookeeper Provider的时候,状态不会持久化到本地,而是将数据发送给zookeeper。

我探索了zookeeper znodes,找不到任何与状态相关的数据,我能找到的只有Coordinator和Primary节点的信息。但是,本地状态目录仍然被填满。

配置很简单,我有3个外部ZK节点和3个Nifi实例。

这是 nifi.properties 文件的摘录:

nifi.cluster.is.node=true
nifi.zookeeper.connect.string=zk-node1:2181,zk-node2:2181,zk-node3:2181
nifi.state.management.embedded.zookeeper.start=false
nifi.state.management.provider.cluster=zk-provider

这里是 state-management.xml 文件的摘录:

<cluster-provider>
        <id>zk-provider</id>
        <class>org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider</class>
        <property name="Connect String">zk-node1:2181,zk-node2:2181,zk-node3:2181</property>
        <property name="Root Node">/nifi</property>
        <property name="Session Timeout">10 seconds</property>
        <property name="Access Control">Open</property>
    </cluster-provider>

当我尝试 ls Zookeeper 时,我只能看到 2 个 znode:“components”,但这个 znode 是空的,并且“leaders”zonde 包含有关 Nifi 协调器和主节点的一些数据。

此外,当我浏览事务日志时,即使使用了一些负载平衡连接,我也找不到与 Nifi 状态相关的任何内容。

有人能解释一下 Zookeeper 的数据是什么,为什么即使我们配置了 zk 提供程序,本地状态目录仍然被填满?

谢谢。

【问题讨论】:

  • Zk 状态不是通用的,每个处理器或服务都必须使用 zk 来实现有状态操作。此外,NiFi 使用本地 h2 数据库进行数据处理状态管理。

标签: state apache-nifi apache-zookeeper


【解决方案1】:

这取决于处理器,在某些情况下,存储集群范围的状态永远不会有意义,因为它永远不会被另一个节点拾取。例如,ListFile 从本地目录跟踪,另一个节点无法访问同一目录,因此将此状态存储在 ZK 中没有帮助。

在状态目录的预写日志中总是有一个本地状态提供者,在存储时由处理器决定它应该是集群状态还是本地状态。

每个处理器的文档应该说明状态是如何存储的。例如,来自 ListFile:

@Stateful(scopes = {Scope.LOCAL, Scope.CLUSTER}, description = "After performing a listing of files, the timestamp of the newest file is stored. "
    + "This allows the Processor to list only files that have been added or modified after "
    + "this date the next time that the Processor is run. Whether the state is stored with a Local or Cluster scope depends on the value of the "
    + "<Input Directory Location> property.")

如果输入目录位置是“远程”,那么它将使用集群状态,否则使用本地状态。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 2012-12-09
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多