Apache flink 为什么弗林克可以';无法从保存点恢复
flink 1.7版 我正在尝试从保存点(或检查点)进行flink作业还原,作业所做的是从kafka->执行30分钟窗口聚合(如计数器)->接收到kafka 我使用rocksdb和启用的检查点 现在我尝试手动触发一个保存点。 每个聚合数据的预期值为30(每分钟1个数据)。 但是,当我从保存点(flink run-d-s{url})还原时,聚合值不是30(小于30,取决于我取消flink作业和还原的时间)。 当作业正常运行时,它将得到30 我不知道为什么有些数据会丢失 日志显示“FlinkKafkaConsumer没有恢复状态” 主要代码:Apache flink 为什么弗林克可以';无法从保存点恢复,apache-flink,restore,checkpoint,Apache Flink,Restore,Checkpoint,flink 1.7版 我正在尝试从保存点(或检查点)进行flink作业还原,作业所做的是从kafka->执行30分钟窗口聚合(如计数器)->接收到kafka 我使用rocksdb和启用的检查点 现在我尝试手动触发一个保存点。 每个聚合数据的预期值为30(每分钟1个数据)。 但是,当我从保存点(flink run-d-s{url})还原时,聚合值不是30(小于30,取决于我取消flink作业和还原的时间)。 当作业正常运行时,它将得到30 我不知道为什么有些数据会丢失 日志显示“FlinkKafk
source.flatMap(new FlatMapFunction<String, Model>() {
private static final long serialVersionUID = 5814342517597371470L;
@Override
public void flatMap(String value, Collector<Model> out) throws Exception {
LOGGER.info("----> catch value: " + value);
Model model = JSONObject.parseObject(value, Model.class);
out.collect(model);
}
}).uid("flatmap-1").name("flatmap-1").assignTimestampsAndWatermarks(new AssignerWithPunctuatedWatermarks<Model>() {
private static final long serialVersionUID = -1742071229344039681L;
@Override
public long extractTimestamp(Model element, long previousElementTimestamp) {
return element.getTime();
}
@Nullable
@Override
public Watermark checkAndGetNextWatermark(Model lastElement, long extractedTimestamp) {
return new Watermark(extractedTimestamp);
}
}).setParallelism(1).keyBy(Model::getDim).window(new DynamicWindowAssigner()).aggregate(new AggregateFunction<Model, Model, Model>() {
@Override
public Model createAccumulator() {
return new Model();
}
@Override
public Model add(Model value, Model accumulator) {
init(value, accumulator);
accumulator.setValue(accumulator.getValue() + 1);
return accumulator;
}
@Override
public Model getResult(Model accumulator) {
return accumulator;
}
@Override
public Model merge(Model a, Model b) {
return null;
}
private void init(Model value, Model accumulator){
if(accumulator.getTime() == 0L){
accumulator.setValue(0);
accumulator.setDim(value.getDim());
accumulator.setTime(value.getTime());
}
}
}).uid("agg-1").name("agg-1").map(new MapFunction<Model, String>() {
private static final long serialVersionUID = -1742071229344039681L;
@Override
public String map(Model value) throws Exception {
value.setTime(TimeWindow.getWindowStartWithOffset(value.getTime(), 0, TimeUnit.MINUTES.toMillis(30)));
return JSONObject.toJSONString(value);
}
}).uid("flatmap-2").name("flatmap-2").setParallelism(4).addSink(metricProducer).uid("sink").name("sink").setParallelism(2);
最后,我应该使用flinkrun-s{savepoint}-dxxx.jar
与flink run-d xxx.jar-s{savepoint}不同,如果“-d”标志在“-s”标志前面,那么flink ignore“-s”不知何故“No restore state”仅在检查点或保存点未用于初始化作业状态时才会被记录,这解释了为什么会看到不正确的结果。我看不出你分享的东西有什么明显的错误,但是如果你分享更多的细节,问题会变得很明显。(另外,您是在运行Flink 1.7.2还是更早的版本?)@David Anderson thx,我使用的是v1.7。1@DavidAnderson和我检查了保存点的hdfs目录,它似乎包含“_meta”和其他目录(保存流状态和kafka偏移量?)代码已更新,flink集群由3个主节点、多个从节点组成,flink运行时是flink-dist_2.11-1.7.1.jar
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
env.enableCheckpointing(60000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setCheckpointTimeout(120000);
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(50000);
StateBackend stateBackend = new RocksDBStateBackend(${path}, true);
env.setStateBackend(stateBackend);
env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
env.getConfig().disableSysoutLogging();