【问题标题】:Savepoint - Operators could not matched in Apache FlinkSavepoint - 操作符在 Apache Flink 中无法匹配
【发布时间】:2021-05-04 23:45:20
【问题描述】:

我正在尝试使用保存点停止我的工作,然后使用相同的保存点再次启动它。就我而言,我更新了我的工作,并用新的 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
   }
}

我用保存点停止了我的工作,它有效。然后我尝试使用相同的保存点部署具有新版本(新过滤方法)的作业,它无法匹配操作员并且作业未部署。为什么?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    除非您在获取保存点之前为所有有状态操作符明确提供 UID,否则在更改作业的拓扑之后,Flink 将不再能够确定保存点中的哪个状态属于哪个操作符。

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

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

    env
      .addSource(...)
      .name("KafkaSource")
      .uid("KafkaSource")
    
    results.addSink(...)
        .name("KafkaSink")
        .uid("KafkaSink")
    

    name() 方法用于提供出现在 Web UI 中的文本。

    【讨论】:

    • 我没有关于 kafka 源和接收器的 uid。这是我的 readFromKafkaMethod; val consumer = new FlinkKafkaConsumer[String](topic, new SimpleStringSchema, consumerProperties) env.addSource(consumer)我可以像这样为源和接收器添加ui吗? env.addSource(consumer).uid(kafka-source) resultDS.addSink(kafkaSink).uid(kafka-sink) 对吗?我现在就分享日志
    • 这里是错误日志; Caused by: java.lang.IllegalStateException: Failed to rollback to checkpoint/savepoint s3://path-to-savepoint. Cannot map checkpoint/savepoint state for operator 85e9831daeec37ef040685ddfcaa91ce to the new program, because the operator is not available in the new program. If you want to allow to skip this, you can set the --allowNonRestoredState option on the CLI.
    • 我也想知道uid代表job中唯一的id,对吧?或者它代表所有作业的唯一 ID?
    • env.addSource().uid().map().filter()new Reader().read().uid()有区别吗?
    猜你喜欢
    • 2022-11-16
    • 2017-10-29
    • 2021-12-24
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多