flink sql 窗口场景的问题

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

flink sql 窗口场景的问题

stevenchen01
 hi :
      我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。

比如数据
{ts: 2019-12-10 16:24:00 id: 1}
{ts: 2019-12-10 16:22:00 id: 1}
{ts: 2019-12-10 16:23:00 id: 2}
{ts: 2019-12-10 16:21:00 id: 1}
{ts: 2019-12-10 16:29:00 id: 2}
{ts: 2019-12-10 16:27:00 id: 3}
{ts: 2019-12-10 16:26:00 id: 2}







 
smq
Reply | Threaded
Open this post in threaded view
|

回复:flink sql 窗口场景的问题

smq
我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。


---原始邮件---
发件人: &quot;steven chen&quot;<[hidden email]&gt;
发送时间: 2020年6月3日(周三) 凌晨2:49
收件人: &quot;[hidden email]&quot;<[hidden email]&gt;;
主题: flink sql 窗口场景的问题


 hi :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。

比如数据
{ts: 2019-12-10 16:24:00 id: 1}
{ts: 2019-12-10 16:22:00 id: 1}
{ts: 2019-12-10 16:23:00 id: 2}
{ts: 2019-12-10 16:21:00 id: 1}
{ts: 2019-12-10 16:29:00 id: 2}
{ts: 2019-12-10 16:27:00 id: 3}
{ts: 2019-12-10 16:26:00 id: 2}







&nbsp;
Reply | Threaded
Open this post in threaded view
|

Re: flink sql 窗口场景的问题

Leonard Xu
Hi,
窗口输出可以加emit策略,在watermark未触发时提前输出window的中间结果,不过社区目前标注的是experimental的功能,生产环境中应谨慎使用。
table.exec.emit.early-fire.enabled
table.exec.emit.early-fire.delay
可以参考[1]。

https://github.com/apache/flink/blob/master/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/plan/utils/WindowEmitStrategy.scala#L174 <https://github.com/apache/flink/blob/master/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/plan/utils/WindowEmitStrategy.scala#L174>


Best
Leonard Xu

> 在 2020年6月3日,08:22,smq <[hidden email]> 写道:
>
> 我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。
>
>
> ---原始邮件---
> 发件人: &quot;steven chen&quot;<[hidden email]&gt;
> 发送时间: 2020年6月3日(周三) 凌晨2:49
> 收件人: &quot;[hidden email]&quot;<[hidden email]&gt;;
> 主题: flink sql 窗口场景的问题
>
>
> hi :
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
> 但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。
>
> 比如数据
> {ts: 2019-12-10 16:24:00 id: 1}
> {ts: 2019-12-10 16:22:00 id: 1}
> {ts: 2019-12-10 16:23:00 id: 2}
> {ts: 2019-12-10 16:21:00 id: 1}
> {ts: 2019-12-10 16:29:00 id: 2}
> {ts: 2019-12-10 16:27:00 id: 3}
> {ts: 2019-12-10 16:26:00 id: 2}
>
>
>
>
>
>
>
> &nbsp;

Reply | Threaded
Open this post in threaded view
|

回复:flink sql 窗口场景的问题

shao.hongxiao
In reply to this post by smq
考虑使用滑动窗口和步长




| |
邵红晓
|
|
邮箱:[hidden email]
|

签名由 网易邮箱大师 定制

在2020年06月03日 08:22,smq 写道:
我觉得既然你想要事实输出数据,那就没必要用窗口,用了时间窗口,那就是按照窗口大小来统计了,不能同时两个都实现吧,把这两种场景分开分别实现,或者你要想得到每分钟的聚合结果,就缩小窗口大小。


---原始邮件---
发件人: &quot;steven chen&quot;<[hidden email]&gt;
发送时间: 2020年6月3日(周三) 凌晨2:49
收件人: &quot;[hidden email]&quot;<[hidden email]&gt;;
主题: flink sql 窗口场景的问题


hi :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。

比如数据
{ts: 2019-12-10 16:24:00 id: 1}
{ts: 2019-12-10 16:22:00 id: 1}
{ts: 2019-12-10 16:23:00 id: 2}
{ts: 2019-12-10 16:21:00 id: 1}
{ts: 2019-12-10 16:29:00 id: 2}
{ts: 2019-12-10 16:27:00 id: 3}
{ts: 2019-12-10 16:26:00 id: 2}







&nbsp;
Reply | Threaded
Open this post in threaded view
|

回复:flink sql 窗口场景的问题

zhiyezou
In reply to this post by stevenchen01
Hi
&nbsp; &nbsp;我们这边也有有类似的场景,看看能否对你有所帮助。
&nbsp; &nbsp;
&nbsp; &nbsp;我们的做法是不用窗口,按照EventTime分组,比如统计每个小时的数据,那我们就按小时分桶,这样,每来一条数据都会触发计算。




------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"steven chen"<[hidden email]&gt;;
发送时间:&nbsp;2020年6月3日(星期三) 凌晨0:02
收件人:&nbsp;"[hidden email]"<[hidden email]&gt;;

主题:&nbsp;flink sql 窗口场景的问题



 hi :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。

比如数据
{ts: 2019-12-10 16:24:00 id: 1}
{ts: 2019-12-10 16:22:00 id: 1}
{ts: 2019-12-10 16:23:00 id: 2}
{ts: 2019-12-10 16:21:00 id: 1}
{ts: 2019-12-10 16:29:00 id: 2}
{ts: 2019-12-10 16:27:00 id: 3}
{ts: 2019-12-10 16:26:00 id: 2}







&nbsp;
Reply | Threaded
Open this post in threaded view
|

回复:flink sql 窗口场景的问题

Yichao Yang
In reply to this post by stevenchen01
Hi
&nbsp; &nbsp; 个人理解可以直接对时间戳字段进行group by,如下:


select floor_day_hour_5minutes(timestamp), count(1)
from source table
group by floor_day_hour_5minutes(timestamp)


上述sql产出retract流,每来一条数据就输出一次,可以满足你的需求,但是有一个问题就是,它不会像窗口一样在窗口结束时删除状态,因此状态会越来越大,你需要设置一些参数去定时删除这些状态,可参考


https://ci.apache.org/projects/flink/flink-docs-stable/dev/table/streaming/query_configuration.html


Best,
Yichao Yang


------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"steven chen"<[hidden email]&gt;;
发送时间:&nbsp;2020年6月3日(星期三) 凌晨0:02
收件人:&nbsp;"[hidden email]"<[hidden email]&gt;;

主题:&nbsp;flink sql 窗口场景的问题



 hi :
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在遇到有这样一个场景,我们需要实时去统计5分和30分的粒度,flink sql 窗口使用了处理时间滚动窗口方式
但是都是只有5分结束的时候才能把聚合结果输出,这个不满足我们需求,有没有方式可以直接实时输出结果,比如18:02 的统计+1+1 都能直接落在18:00-18:05的窗口上,并每次+1都能实时输出,而不是等到窗口结束才sink 到mysql .30分钟同5分种,这种flink sql 如何实现。

比如数据
{ts: 2019-12-10 16:24:00 id: 1}
{ts: 2019-12-10 16:22:00 id: 1}
{ts: 2019-12-10 16:23:00 id: 2}
{ts: 2019-12-10 16:21:00 id: 1}
{ts: 2019-12-10 16:29:00 id: 2}
{ts: 2019-12-10 16:27:00 id: 3}
{ts: 2019-12-10 16:26:00 id: 2}







&nbsp;