Hi,

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


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


Thanks



在 2022-07-14 11:54:00,"barbzhang(张博)" <barbzh...@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项目提供的服务内直接运行,不知道目前能不能做到。

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

 

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

回复