首页 > 解决方案 > Apache Flink:注册名称冲突。名称为 *** 的 KvState 已被其他运营商注册

问题描述

我在运行 flink 作业时遇到了这个问题。

Registration name clash. KvState with name 'XXXX' has already been registered by another operator (fab4c54085fa3ee85a6e1bb1062c20af).

例外:

org.apache.flink.runtime.execution.SuppressRestartsException: Unrecoverable failure. This suppresses job restarts. Please check the stack trace for the root cause.
    at org.apache.flink.runtime.query.KvStateLocationRegistry.notifyKvStateRegistered(KvStateLocationRegistry.java:120)
    at org.apache.flink.runtime.jobmanager.JobManager.org$apache$flink$runtime$jobmanager$JobManager$$handleKvStateMessage(JobManager.scala:1517)
    at org.apache.flink.runtime.jobmanager.JobManager$$anonfun$handleMessage$1.applyOrElse(JobManager.scala:740)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at org.apache.flink.runtime.LeaderSessionMessageFilter$$anonfun$receive$1.applyOrElse(LeaderSessionMessageFilter.scala:49)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at org.apache.flink.runtime.LogMessages$$anon$1.apply(LogMessages.scala:33)
    at org.apache.flink.runtime.LogMessages$$anon$1.apply(LogMessages.scala:28)
    at scala.PartialFunction$class.applyOrElse(PartialFunction.scala:123)
    at org.apache.flink.runtime.LogMessages$$anon$1.applyOrElse(LogMessages.scala:28)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:502)
    at org.apache.flink.runtime.jobmanager.JobManager.aroundReceive(JobManager.scala:122)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526)
    at akka.actor.ActorCell.invoke(ActorCell.scala:495)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
    at akka.dispatch.Mailbox.run(Mailbox.scala:224)
    at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.lang.IllegalStateException: Registration name clash. KvState with name 'XXXX' has already been registered by another operator (fab4c54085fa3ee85a6e1bb1062c20af).
    at org.apache.flink.runtime.query.KvStateLocationRegistry.notifyKvStateRegistered(KvStateLocationRegistry.java:116)
    ... 20 more

当我从 IntelliJ IDE 运行作业时,它运行良好,但是当我使用以下命令运行作业时,我遇到了这个问题。

bin/flink 运行 -c com.xxx.XXXJob

这个错误的原因应该是什么?我已重新启动 flink 并重新运行作业,但我仍然收到此错误。

标签: apache-flinkflink-streaming

解决方案


我在两个进程函数中配置了同名的可查询状态。

    @Override
    public void open(Configuration parameters) {
        ValueStateDescriptor<? super Output> descriptor = new ValueStateDescriptor(queryableStateName, Xyz.class);
        descriptor.setQueryable("downloads");
        state = getRuntimeContext().getState(descriptor);
    }

在上面的代码descriptor.setQueryable("downloads");中,我给出downloads了多个进程函数。

关于我对为什么它是从命令IDE而不是通过bin/flink run命令运行感到惊讶。

所以原因是'flink-queryable-state-runtime_2.11-1.4.2.jar'

当我从 IDE 运行时,IDE 无法从类路径中找到这个 jar。因此可查询功能被禁用,并且由于该工作永远不会抱怨。所以作业成功运行。

但是当我使用bin/flink run它时,它是从 flink 的库中找到的。

因此,由于名称相同并且作业失败,它会给出错误。


推荐阅读