You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "barbzhang(张博)" <ba...@tencent.com> on 2022/07/14 03:54:00 UTC

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

您好,我目前在调研Flink对于即席查询场景的支持程度,打算通过Flink查询HDFS中的数据,对查询实效性要求高,查询平均时延要求在秒级。
我调研了Flink集群的多种部署模式,发现Standalone on k8s 模式下的 Flink Session集群<https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/deployment/resource-providers/standalone/kubernetes/#kubernetes-%e4%b8%8a%e7%9a%84-flink-session-%e9%9b%86%e7%be%a4> 最满足这种需求,因此搭建了该种模式的Flink集群,打算通过我们自研的Java项目集成Flink API提交查询SQL到Flink集群执行。

目前我发现通过Java项目往Flink提交SQL有两种方式:
方式一:通过Flink Table API<https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/connectors/table/hive/overview/#%e8%bf%9e%e6%8e%a5%e5%88%b0hive> 的方式
这种方式需要将集成Flink Table API的代码打成jar包,放在我们Java项目服务的服务器上,然后在Java项目内通过调用启动脚本的方式往Flink集群提交任务,类似:flink run -m {host}:{port} xxx.jar。
这种方式的缺点是main()方法在客户端执行,而且涉及到客户端往JobManager、JobManager往TaskManager分发jar包的过程,时延较高,一般至少需要十秒以上,不太满足即席查询对时延的要求。
方式二:采用类似SQL客户端<https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/dev/table/sqlclient/> 的方式
这种方式没有分发jar包的过程,相对第一种方式而言时延较低,问题就在于Java项目该如何集成SQL客户端?我研究了相关代码,打算通过我们自研的Java项目直接调用Flink SqlClient的相关方法,类似:SQL客户端提交SQL demo<https://github.com/apache/flink/blob/release-1.14.3/flink-table/flink-sql-client/src/test/java/org/apache/flink/table/client/SqlClientTest.java#L176>。但是这种方式我们接收到的返回内容是字符串,而不是结构化的Java对象,不像Table API封装的那么好,需要自行做反序列化处理,而且我个人觉得这种方式不太合适。

综上,我想请教下您两个问题:
问题一:Flink Standalone集群其实就是常驻进程了,类似Presto这种引擎,上述方式一有没有可能Java项目集成Flink Table API时,直接在Java项目内运行这段代码,相当于该Java服务作为客户端,直接往Flink集群提交SQL,而不是绕了一次,先打好jar包再通过 flink run提交jar包的方式提交SQL。
我想让这段代码直接在Java项目提供的服务内直接运行,不知道目前能不能做到。
[cid:image001.png@01D89778.222ACE50]
问题二:除了问题一的解决方案,还有没有其他方式能满足目前我们这种需求?

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

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

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

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


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

Posted by RS <ti...@163.com>.
Hi,


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


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


Thanks



在 2022-07-14 11:54:00,"barbzhang(张博)" <ba...@tencent.com> 写道:

您好,我目前在调研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项目提供的服务内直接运行,不知道目前能不能做到。

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

 

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