EDIT2:跳到最后,状态已恢复,但它不可查询新tl; dr “如何使State可查询,从检查点恢复后仍可查询?”
我有一个带有检查指示的键控流,类似于此(我在内存和HDFS中都试过这个,结果相同)
env.enableCheckpointing(60000)
env.setStateBackend(new FsStateBackend("file:///flink-test"))
val stream = env.addSource(consumer)
.flatMap(new ValidationMap()).name("ValidationMap")
.keyBy(x => new Tuple3[String, String, String](x.account(), x.organization(), x.`type`()))
.flatMap(new Foo()).name(jobname)
在此流中,我有一个Managed Keyed State ValueState,我将其设置为可查询。
val newValueStateDescriptor = new ValueStateDescriptor[java.util.ArrayList[java.util.ArrayList[Long]]]("foo", classOf[java.util.ArrayList[java.util.ArrayList[Long]]])
newValueStateDescriptor.setQueryable("foo")
valueState = getRuntimeContext.getState[java.util.ArrayList[java.util.ArrayList[Long]]](newValueStateDescriptor)
valueState.update(new java.util.ArrayList[java.util.ArrayList[Long]]())
定期附加或删除此列表,并更新valueState。当我提出可查询状态的请求时,我当前看到了正确的值。
在我的JobManager日志中,我看到每分钟检查一次,当我检查文件系统时,我看到正在创建的文件非空。
我的设置有3个JobManagers(2个待机状态),3个TaskManagers(全部3个在使用中)。
我将一个数据点放入系统并从QueryableState读取,一切看起来都不错。然后我选择一个TaskManager(甚至不是处理数据的那个,3个中的任何一个)并且我将其删除,然后重新启动它以模拟崩溃。
我看到作业重试了2到3次,直到TaskManager重新上线,最后我看到在Flink再次运行相同的JobID,生活似乎很好。
但是,我再次点击可查询状态,我得到一个UnknownKvStateLocation异常。
我真的不太确定我在这里做错了什么,事情似乎是检查指向,但我从来没有设法让我的ValueState回来?也许它回来但不是可查询的?
编辑: 来自JobManager的日志片段意味着已恢复的内容
{"level":"INFO","time":"2017-06-01 15:30:02,332","class":"org.apache.flink.runtime.executiongraph.ExecutionGraph","ndc":"", "message":"Job Foo (dc7850a6866f181c2f07968d35fe3d46) switched from state RESTARTING to CREATED."}
{"level":"INFO","time":"2017-06-01 15:30:02,332","class":"org.apache.flink.runtime.checkpoint.ZooKeeperCompletedCheckpointStore","ndc":"", "message":"Recovering checkpoints from ZooKeeper."}
{"level":"INFO","time":"2017-06-01 15:30:02,333","class":"org.apache.flink.runtime.checkpoint.ZooKeeperCompletedCheckpointStore","ndc":"", "message":"Found 1 checkpoints in ZooKeeper."}
{"level":"INFO","time":"2017-06-01 15:30:02,333","class":"org.apache.flink.runtime.checkpoint.ZooKeeperCompletedCheckpointStore","ndc":"", "message":"Trying to retrieve checkpoint 5."}
{"level":"INFO","time":"2017-06-01 15:30:02,340","class":"org.apache.flink.runtime.checkpoint.CheckpointCoordinator","ndc":"", "message":"Restoring from latest valid checkpoint: Checkpoint 5 @ 1496330912627 for dc7850a6866f181c2f07968d35fe3d46."}
{"level":"INFO","time":"2017-06-01 15:30:02,340","class":"org.apache.flink.runtime.executiongraph.ExecutionGraph","ndc":"", "message":"Job Foo (dc7850a6866f181c2f07968d35fe3d46) switched from state CREATED to RUNNING."}
它真的看起来已经恢复了,当我检查在/ flink-test中创建的文件时,我看到了一些二进制数据,但它包含了我的可查询状态ValueState的标识名称。任何关于寻找什么的想法都会受到欢迎。
EDIT2:状态>是<恢复,它只是不可查询!
答案 0 :(得分:0)
已经使某个已注册状态可查询的事实不是(当前)Flink在检查点或保存点中记录的部分。因此,在恢复之后,状态是不可查询的,直到提供新的StateDescriptor。
有关详情,请参阅flink-users邮件列表中的this discussion。