Re:咨询 Flink 在 OLAP、即席查询场景下的应用问题

2022-07-13 文章 RS
Hi,


打算通过Flink查询HDFS中的数据,对查询实效性要求高,查询平均时延要求在秒级。
=
这种高实时性的要求,是不适合Presto或者Flink引擎的。


如果是数据量不大,查询逻辑不复杂,实时性要求高,建议数据同步到数据库中,使用数据库引擎来查询;
如果是数据量大,查询逻辑复杂,实时性要求不高,Flink或者Presto是可以的;
如果是数据量大,查询逻辑复杂,实时性要求高,那什么都拯救不了你


Thanks



在 2022-07-14 11:54:00,"barbzhang(张博)"  写道:

您好,我目前在调研Flink对于即席查询场景的支持程度,打算通过Flink查询HDFS中的数据,对查询实效性要求高,查询平均时延要求在秒级。

我调研了Flink集群的多种部署模式,发现Standalone on k8s 模式下的 Flink 
Session集群最满足这种需求,因此搭建了该种模式的Flink集群,打算通过我们自研的Java项目集成Flink API提交查询SQL到Flink集群执行。

 

目前我发现通过Java项目往Flink提交SQL有两种方式:

方式一:通过Flink Table API的方式

这种方式需要将集成Flink Table 
API的代码打成jar包,放在我们Java项目服务的服务器上,然后在Java项目内通过调用启动脚本的方式往Flink集群提交任务,类似:flink run 
-m {host}:{port} xxx.jar。

这种方式的缺点是main()方法在客户端执行,而且涉及到客户端往JobManager、JobManager往TaskManager分发jar包的过程,时延较高,一般至少需要十秒以上,不太满足即席查询对时延的要求。

方式二:采用类似SQL客户端的方式

这种方式没有分发jar包的过程,相对第一种方式而言时延较低,问题就在于Java项目该如何集成SQL客户端?我研究了相关代码,打算通过我们自研的Java项目直接调用Flink
 SqlClient的相关方法,类似:SQL客户端提交SQL demo。但是这种方式我们接收到的返回内容是字符串,而不是结构化的Java对象,不像Table 
API封装的那么好,需要自行做反序列化处理,而且我个人觉得这种方式不太合适。

 

综上,我想请教下您两个问题:

问题一:Flink Standalone集群其实就是常驻进程了,类似Presto这种引擎,上述方式一有没有可能Java项目集成Flink Table 
API时,直接在Java项目内运行这段代码,相当于该Java服务作为客户端,直接往Flink集群提交SQL,而不是绕了一次,先打好jar包再通过 flink 
run提交jar包的方式提交SQL。

我想让这段代码直接在Java项目提供的服务内直接运行,不知道目前能不能做到。

问题二:除了问题一的解决方案,还有没有其他方式能满足目前我们这种需求?

 

抱歉打扰您了,万分感谢!

Re: 咨询 Flink 在 OLAP、即席查询场景下的应用问题

2022-07-13 文章 lizhiqiang
1. 可以考虑一下 flink sql gateway 的方式去进行提交。项目地址: 
https://github.com/ververica/flink-sql-gateway 
 
2. 可以集成一下 kyuubi。功能更强一些,但是需要一定的改造量。 项目地址: 
https://github.com/apache/incubator-kyuubi

> 2022年7月14日 11:54,barbzhang(张博)  写道:
> 
> 您好,我目前在调研Flink对于即席查询场景的支持程度,打算通过Flink查询HDFS中的数据,对查询实效性要求高,查询平均时延要求在秒级。
> 我调研了Flink集群的多种部署模式,发现Standalone on k8s 模式下的 Flink Session集群 
> 
>  最满足这种需求,因此搭建了该种模式的Flink集群,打算通过我们自研的Java项目集成Flink API提交查询SQL到Flink集群执行。
>  
> 目前我发现通过Java项目往Flink提交SQL有两种方式:
> 方式一:通过Flink Table API 
> 
>  的方式
> 这种方式需要将集成Flink Table 
> API的代码打成jar包,放在我们Java项目服务的服务器上,然后在Java项目内通过调用启动脚本的方式往Flink集群提交任务,类似:flink run 
> -m {host}:{port} xxx.jar。
> 这种方式的缺点是main()方法在客户端执行,而且涉及到客户端往JobManager、JobManager往TaskManager分发jar包的过程,时延较高,一般至少需要十秒以上,不太满足即席查询对时延的要求。
> 方式二:采用类似SQL客户端 
> 
>  的方式
> 这种方式没有分发jar包的过程,相对第一种方式而言时延较低,问题就在于Java项目该如何集成SQL客户端?我研究了相关代码,打算通过我们自研的Java项目直接调用Flink
>  SqlClient的相关方法,类似:SQL客户端提交SQL demo 
> 。但是这种方式我们接收到的返回内容是字符串,而不是结构化的Java对象,不像Table
>  API封装的那么好,需要自行做反序列化处理,而且我个人觉得这种方式不太合适。
>  
> 综上,我想请教下您两个问题:
> 问题一:Flink Standalone集群其实就是常驻进程了,类似Presto这种引擎,上述方式一有没有可能Java项目集成Flink Table 
> API时,直接在Java项目内运行这段代码,相当于该Java服务作为客户端,直接往Flink集群提交SQL,而不是绕了一次,先打好jar包再通过 
> flink run提交jar包的方式提交SQL。
> 我想让这段代码直接在Java项目提供的服务内直接运行,不知道目前能不能做到。
> 
> 问题二:除了问题一的解决方案,还有没有其他方式能满足目前我们这种需求?
>  
> 抱歉打扰您了,万分感谢!