Apache flink 无法使用Flink处理器API还原检查点状态

Apache flink 无法使用Flink处理器API还原检查点状态,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,主程序使用kafka事件,然后过滤->映射->按键->CEP->接收。我编写了另一个单独的简单程序来读取检查点目录,如下所示: object StateReader extends App { val path = "file://...." val env = ExecutionEnvironment.getExecutionEnvironment val chk = Savepoint.load(env.getJavaEnv, path, new FsS

主程序使用kafka事件,然后过滤->映射->按键->CEP->接收。我编写了另一个单独的简单程序来读取检查点目录,如下所示:

object StateReader extends App {

  val path = "file://...."

  val env = ExecutionEnvironment.getExecutionEnvironment

  val chk = Savepoint.load(env.getJavaEnv, path, new FsStateBackend(path))

  val ds = chk.readKeyedState("cep", new CepOperatorReadFunction, TypeInformation.of(classOf[KEY]), TypeInformation.of(classOf[VALUE]))
  println(ds.count())

}

class CepOperatorReadFunction extends KeyedStateReaderFunction[KEY, VALUE] {
  override def open(parameters: Configuration): Unit = {

  }
  override def readKey(k: KEY, context: KeyedStateReaderFunction.Context, collector: Collector[VALUE]): Unit = {

  }//end readKey
}//end class CepOperatorReadFunction
但是,我得到了以下例外:

Caused by: java.lang.IllegalStateException: Unexpected state handle type, expected: class org.apache.flink.runtime.state.KeyGroupsStateHandle, but found: class org.apache.flink.runtime.state.IncrementalRemoteKeyedStateHandle
    at org.apache.flink.runtime.state.heap.HeapRestoreOperation.restore(HeapRestoreOperation.java:120)
    at org.apache.flink.runtime.state.heap.HeapKeyedStateBackendBuilder.build(HeapKeyedStateBackendBuilder.java:114)
    ... 13 more
以下是
flink-conf.yaml

state.backend: rocksdb
state.checkpoints.dir: hdfs:///.../checkpoints
state.savepoints.dir: hdfs:///.../savepoints
state.backend.incremental: true
state.backend.rocksdb.memory.write-buffer-ratio: 0.6
state.backend.rocksdb.localdir: /var/lib/.../rocksdb
execution.checkpointing.interval: 900000
execution.checkpointing.timeout: 600000
execution.checkpointing.unaligned: true
execution.checkpointing.mode: EXACTLY_ONCE
execution.checkpointing.max-concurrent-checkpoints: 1
execution.checkpointing.min-pause: 0
您知道异常发生的原因以及如何解决问题吗


谢谢

没有现成的支持,可以轻松读取CEP操作员的状态。因此,要实现
KeyedStateReaderFunction
,您必须深入研究CEP实现,找到使用的
ValueState
s和
MapState
s,并实现一个使用相同状态描述符的读卡器。

不能保证状态处理器API能够读取检查点,而且它很有可能不适用于增量检查点。你能用一个保存点来代替吗?在主程序中,我设置了
uid
如下:
CEP.pattern(trafficStream.javaStream,pattern,neweventcomparator[VALUE]{…}.process(new PatternProcessFunction[VALUE,String]{…}.uid(“CEP”).name(“CEP”)
。当我尝试
chk.readKeyedState(“CEP”),…)
,我得到了由以下原因引起的
:java.lang.IllegalStateException:还原中出现意外的密钥组。