原文发布时间:2017年
QueryableStates 允许用户对流的内部状态进行实时查询,而无需将结果存储到任何外部存储中。 这制造了许多有趣的可能,因为我们不再需要等待系统写入外部存储(这一直是此类系统的主要瓶颈之一)。 甚至可能没有任何类型的数据库能让用户的应用程序直接查询流,这将使应用程序更快、更便宜。 这可能不适用于所有用例,但如果您的 Pipeline 必须维护内部状态(可能是进行一些聚合),则最好使状态可用于查询。
我们首先看看当我们使状态可查询以及何时查询时,在 Flink 内部的整体步骤。
1. 使状态可查询
假设我们已经创建了一个具有可查询状态的 Pipeline 并通过 JobClient 提交了作业。下图显示了 Flink 内部发生的事情:
我希望这个图是不言自明的,但总而言之,一旦提交了 Job,JobManager 就会从 JobGraph 构建 ExecutionGraph,然后将任务部署到 TaskManager。在创建任务实例时,会创建 Operator,如果发现 Operator 是可查询的,则对 Operator 的 ‘状态’ 的引用将保存在 KvStateRegistry 中,并带有一个状态名称。状态名称是在创建作业期间设置的唯一名称。然后 JobManager actor 会收到有关状态注册的通知,JobManager 将位置信息存储在 KvStateLocationRegistry 中,后面就可以在查询期间使用。
2. 查询状态
上图显示了客户端(不属于作业提交的一部分)执行查询期间的步骤。客户端向 JobManager actor 发送 KvStateLookup 消息,该请求应包含构建作业时使用的 JobId 以及状态名称。JobManager 会检查 JobId 的有效性,获取 JobId 的 JobGraph,并从 JobGraph 中检索 KvStateLocationRegistry。JobManager 然后将查询状态对应的状态位置信息返回给 KvStateClient。此响应包含状态存储的 KvStateServer 地址。然后客户端打开与 KvStateServer 的连接并使用 KvStateID 从注册表中获取状态。检索到状态后,将提交异步查询以从给定键的状态中获取值。得到的结果被序列化并发回客户端。同时,状态在处理过程中作业会不断更新,因此客户端在查询时总是可以看到最新的状态值。
在博客的下一部分中,我们将实现一个 Streaming Job,它通过 QueryableState API 公开其状态,并创建一个 QueryClient 来查询此状态。谢谢阅读!
欢迎关注我的公众号和博客:
原文:Queryable States in ApacheFlink - How it works