Flink Sql Gateway是Flink集群的“任务网关”,支持以rest api的形式提交查询、插入、删除等任务。
官网推荐与Flink jdbc driver搭配使用,不过jdbc driver限制了很多功能,如果自己开发数据平台,最好还是直接使用sql gateway。想要透彻的使用sql gateway,需要了解一下问题:
1 如何处理并发请求?多个提交怎么处理?
2 如何维护多个sql之间的关联性?
3 sql字符串如何提交到集群形成代码
4 sql-gateway都支持哪些功能?
1. 整体架构
Sql Gateway其实内部说白了就是一个SessionManager会话管理器以及一个SqlGatewayEndpoint网络服务器。
如果读过flink 源码你就会发现,flink-sql-gateway 是对Flink Table模块中的flink-sql-client 的二次开发,没多大变化。 其中SqlGatewayEndpoint是基于flink runtime.rest.RestServerEndpoint实现的Netty服务器,通过统一的架构设计,实现了多种handler,如创建会话、提交任务、任务状态查询、任务取消、拉取数据等。handle 处理细节可以参考LocalExecuter。所有handler使用公用的SessionManager进行会话管理。SessionManager中维护了一个sessionId和Session的Map,考虑到并发问题,底层采用ConcurrentHashMap作为并发存储。
Session是具体的会话,如果使用RestAPI,则首先需要通过createSession创建session,然后只要指定为该sessionId的请求,都会在一个Session中执行。
所有的提交的任务大体可以分成两类,JobOperation和非JobOperation。JobOperation就是需要提交到Flink集群执行的任务,如select 和 insert;非JobOperation就是不需要提交到集群执行的操作,如create view, create table, drop table等。因此提交到sql gateway的所有任务,会按照sessionId分组,挨个任务执行,当为select 或者 insert时,加入到Session内部的jobOperations集合中,同样使用ConcurrentHashMap存储,目的是为了支持并