很多应用在处理的时候,往往是将结果写入数据库或者外部中,但某些时候,我们需要将状态也暴露到外部中,Flink不仅仅提供了侧输出流,还支持利用将键值分区状态作为可查询状态暴露给外部应用,这就是Flink提供的可查询式状态 queryable state功能,方便任何键值分区状态暴露给外部应用.并且可以进行正常的存储和更新.

那么接下来我们就说明可查询式状态的架构和流式应用如何对外提供可查询状态以及外部应用如何查询到他。

那么可查询状态为了对外暴露,需要引入一个额外的架构,架构整体包含三个进程

QueryableStateClient 用于外部系统提交查询并获取结果

QueryableStateClientProxy 用于接受并响应客户端的请求,客户端需要在每个TaskManager上都运行一个实例,负责和JobManager进行通信,获取键值组分配信息,并将其进行缓存,并和QueryableStateServer通信转发请求.

QueryableStateServer 负责处理代理发来的请求,运行在每个TaskManager上,根据查询的状态返回代理.

图片

为了使用可查询状态服务,需要引入相关依赖.

然后在流应用中,如果希望暴露一个可查询状态,其实很简单,在声明状态的时候,调用StateDescriptor的setQueryable(String),就可以变为可查询的了.比如下面代码

图片

setQueryable中的传入的外部标识符可以随意选择,只是为了在外部查询中使用

除了这种方法,还支持将流中所有事件都存到可查询式的状态中

图片

利用了asQueryableState(),在数据流后面添加一个可查询的数据输出算子.

可查询的状态是ValueState,内部包含着和输入流类型相同的数据.

其次是从外部系统中查询状态

为了可以通过QueryableStateClient中对Flink状态进行查询,需要引入依赖

然后初始化QueryableStateClient,提供一个TaskManager的主机名和可以查询状态客户端代理的监听监控.

之后就可以创建一个对象,并利用getKvState()方法来查询应用状态.

这个方法接收几个参数,包括一个JobId,状态标识符,所需状态的键值,键值的TypeInfomation以及可查询状态的StateDescriptor.

发表评论

邮箱地址不会被公开。 必填项已用*标注