Flink sql进行状态检查点

时间:2018-12-28 09:07:45

标签: apache-flink flink-streaming flink-sql

当我使用flink sql api进程数据时。

重新启动应用程序,sum的结果未保存在检查点中。它仍然从1开始。

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StateBackend stateBackend = new FsStateBackend("file:///D:/d_backup/github/flink-best-practice/checkpoint");
env.enableCheckpointing(1000 * 60);
env.setStateBackend(stateBackend);

Table table = tableEnv.sqlQuery("select sum(area_id) from rtc_warning_gmys where area_id = 1 group by character_id,area_id,group_id,platform");

//   convert the Table into a retract DataStream of Row.
//   A retract stream of type X is a DataStream<Tuple2<Boolean, X>>.
//   The boolean field indicates the type of the change.
//   True is INSERT, false is DELETE.
DataStream<Tuple2<Boolean, Row>> dsRow = tableEnv.toRetractStream(table, Row.class);
dsRow.map(new MapFunction<Tuple2<Boolean,Row>, Object>() {
	@Override
	public Object map(Tuple2<Boolean, Row> booleanRowTuple2) throws Exception {
		if(booleanRowTuple2.f0) {
			System.out.println(booleanRowTuple2.f1.toString());
			return booleanRowTuple2.f1;
		}
		return null;
	}
});

env.execute("Kafka table select");

登录为:

1 2 3 ... ... 100

重新启动应用程序,它仍然会启动: 1个 2 3 ...

我认为总和值将存储在checkpint文件中,并且重新启动应用程序可以从checkpint读取最后的结果,例如:

101 102 103 ... 120

1 个答案:

答案 0 :(得分:2)

一些可能性:

  • 作业是否运行了足够长的时间以完成检查点?仅仅因为作业产生了输出并不意味着检查点已完成。我看到您已将检查点配置为每分钟发生一次,并且检查点可能需要一些时间才能完成。

  • 工作如何停止?除非已将其外部化,否则取消作业时将删除检查点。

  • 工作如何重新启动?它是从检查点恢复(自动),还是从外部检查点或保存点恢复,还是从头开始?

这种实验最容易通过命令行完成。例如,您可能

  1. 编写一个使用检查点并具有重启策略的应用(例如env.setRestartStrategy(RestartStrategies.fixedDelayRestart(1000, 1000))
  2. 启动本地集群
  3. “ flink run -d app.jar”开始工作
  4. 等到至少一个检查点完成
  5. “杀死-9 task-manager-PID ”导致失败
  6. “ taskmanager.sh开始”以允许作业从检查点恢复