Apache flink 保存点-在Apache Flink中无法匹配运算符

Apache flink 保存点-在Apache Flink中无法匹配运算符,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我试图使用保存点停止我的作业,然后使用相同的保存点重新启动它。对于我的情况,我更新了我的作业,并使用新jar为其创建新版本。下面是我的代码示例 class Reader(bla bla) { def read() = { val ds = readFromKafka() transform(ds) } def transform(ds: DataStream[]) = { ds.map() } } object MyJob { def

我试图使用保存点停止我的作业,然后使用相同的保存点重新启动它。对于我的情况,我更新了我的作业,并使用新jar为其创建新版本。下面是我的代码示例

class Reader(bla bla) {
   def read() = {
     val ds = readFromKafka()
     transform(ds)
   }
   def transform(ds: DataStream[]) = {
      ds.map()
   }
}

object MyJob {
  def run () = {
    val data = new Reader().read()
    data.keyBy(id).process(new MyStateFunc).uid("my-uid") // then write to kafka
  }
}
在本例中,我确实使用保存点停止了作业,然后使用相同的jar使用相同的保存点启动它。然后,我向我的阅读器添加一个过滤器,如下所示

class Reader(bla bla) {
   def read() = {
     val ds = readFromKafka()
     transform(ds)
   }
   def transform(ds: DataStream[]) = {
      ds.map().filter() // FILTER ADDED HERE
   }
}

我用savepoint停止我的工作,它工作了。然后我尝试使用相同的保存点部署具有新版本(新筛选方法)的作业,它无法匹配运算符,并且作业未部署。为什么?

除非在获取保存点之前为所有有状态运算符显式提供UID,否则在更改作业拓扑后,Flink将无法确定保存点中的哪个状态属于哪个运算符

我看到您的键控进程函数(“我的UID”)上有一个UID。但是你也需要在卡夫卡的源和接收器上有UID,以及任何其他有状态的东西。这些UID需要附加到有状态操作符本身,并且需要在作业中是唯一的(但不是在所有作业中)。(此外,每个状态描述符需要使用运算符中唯一的名称为每个状态分配一个名称。)

通常一个人会做这样的事情

env
.addSource(…)
.名称(“卡夫卡索资源”)
.uid(“卡夫卡索资源”)
结果:addSink(…)
.名称(“卡夫卡辛”)
.uid(“卡夫卡辛”)

其中
name()
方法用于提供web UI中显示的文本。

我在kafka源和接收器上没有uid。这是我从《卡夫卡密德》中读到的书
val consumer=new flinkkafaconsumer[String](主题,new SimpleStringSchema,consumerProperties)env.addSource(consumer)
我可以像那样为源和接收器添加ui吗
env.addSource(consumer).uid(kafka-source)
resultDS.addSink(kafkaSink).uid(kafka-sink)对吗?我将共享日志,没有错误日志<代码>由以下原因引起:java.lang.IllegalStateException:回滚到检查点/savepoint s3://保存点路径失败。无法将操作员85e9831daeec37ef040685ddfcaa91ce的检查点/保存点状态映射到新程序,因为该操作员在新程序中不可用。如果要允许跳过此操作,可以在CLI上设置--allowNonRestoredState选项。我还想了解uid代表作业中的唯一id,对吗?或者它表示所有作业中的唯一id?是否有任何差异
env.addSource().uid().map().filter()
new Reader().read().uid()