flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

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

flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

hiroot
hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
select   
 '2020-03-19' as dt ,  
 '2020-03-19 12:05:00'  as etltime ,
 count(1) as pv , 
 count(distinct userid) as uv 
from t_user_log 
where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and logintime < '2020-03-19 12:05:00'&nbsp;


这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Jark
Administrator
Hi 你可以看下这篇文章是否满足的你需求:
http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql
#统计一天每10分钟累计独立用户数

Best,
Jark


On Thu, 19 Mar 2020 at 23:30, hiliuxg <[hidden email]> wrote:

> hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> select&nbsp; &nbsp;
> &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> &nbsp;count(1) as pv ,&nbsp;
> &nbsp;count(distinct userid) as uv&nbsp;
> from t_user_log&nbsp;
> where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and logintime <
> '2020-03-19 12:05:00'&nbsp;
>
>
> 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Tianwang Li
In reply to this post by hiroot
SELECT HOP_START (ts, INTERVAL '3' MINUTE, INTERVAL '24' HOUR),
       HOP_END (ts, INTERVAL '3' MINUTE, INTERVAL '24' HOUR),
       dt,
       count(1) as pv,
       count(distinct userid) as uv
FROM t_user_log
GROUP BY HOP (ts, INTERVAL '5' MINUTE, INTERVAL '24' HOUR),
         dt

简单粗暴的可以用滑动窗口的SQL,实现。
写代码就比较简单了,自定义实现一下触发器。


hiliuxg <[hidden email]> 于2020年3月19日周四 下午11:30写道:

> hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> select&nbsp; &nbsp;
> &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> &nbsp;count(1) as pv ,&nbsp;
> &nbsp;count(distinct userid) as uv&nbsp;
> from t_user_log&nbsp;
> where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and logintime <
> '2020-03-19 12:05:00'&nbsp;
>
>
> 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?



--
**************************************
 tivanli
**************************************
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Tianwang Li
In reply to this post by Jark
Hi, Jark , 看了你的文章,有一点不是很清楚。

基于 uv_per_10min 再根据分钟时间进行一次聚合,这样每10分钟只有一个点会存储在 Elasticsearch 中,对于
Elasticsearch 和 Kibana 可视化渲染的压力会小很多。

INSERT INTO cumulative_uv
SELECT time_str, MAX(uv)
FROM uv_per_10min
GROUP BY time_str;


怎么实现按分钟聚合?没有明显的窗口设置。有什么内在特性?


Jark Wu <[hidden email]> 于2020年3月20日周五 上午12:25写道:

> Hi 你可以看下这篇文章是否满足的你需求:
>
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql
> #
> <http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql#>
> 统计一天每10分钟累计独立用户数
>
> Best,
> Jark
>
>
> On Thu, 19 Mar 2020 at 23:30, hiliuxg <[hidden email]> wrote:
>
> > hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> > select&nbsp; &nbsp;
> > &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> > &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> > &nbsp;count(1) as pv ,&nbsp;
> > &nbsp;count(distinct userid) as uv&nbsp;
> > from t_user_log&nbsp;
> > where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and logintime <
> > '2020-03-19 12:05:00'&nbsp;
> >
> >
> > 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
>


--
**************************************
 tivanli
**************************************
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Jark
Administrator
Hi,

time_str 在前面已经处理过了,处理成了 10:00, 10:10, 10:20... 这种10分钟间隔的点,所以按照 time_str
分组的话,一天下来也就 24*6 个点。
在 Flink SQL 中,并不一定要 GROUP BY TUMLBE 才能做类似窗口聚合的操作,直接 GROUP BY hour/min/ts
也能达到类似的效果。
只不过前者不会输出更新,且能自动清理 state,后者会输出更新且不会自动清理 state。

Best,
Jark

On Sat, 21 Mar 2020 at 11:24, Tianwang Li <[hidden email]> wrote:

> Hi, Jark , 看了你的文章,有一点不是很清楚。
>
> 基于 uv_per_10min 再根据分钟时间进行一次聚合,这样每10分钟只有一个点会存储在 Elasticsearch 中,对于
> Elasticsearch 和 Kibana 可视化渲染的压力会小很多。
>
> INSERT INTO cumulative_uv
> SELECT time_str, MAX(uv)
> FROM uv_per_10min
> GROUP BY time_str;
>
>
> 怎么实现按分钟聚合?没有明显的窗口设置。有什么内在特性?
>
>
> Jark Wu <[hidden email]> 于2020年3月20日周五 上午12:25写道:
>
> > Hi 你可以看下这篇文章是否满足的你需求:
> >
> >
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql
> > #
> > <
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql#
> >
> > 统计一天每10分钟累计独立用户数
> >
> > Best,
> > Jark
> >
> >
> > On Thu, 19 Mar 2020 at 23:30, hiliuxg <[hidden email]> wrote:
> >
> > > hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> > > select&nbsp; &nbsp;
> > > &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> > > &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> > > &nbsp;count(1) as pv ,&nbsp;
> > > &nbsp;count(distinct userid) as uv&nbsp;
> > > from t_user_log&nbsp;
> > > where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and logintime <
> > > '2020-03-19 12:05:00'&nbsp;
> > >
> > >
> > > 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
> >
>
>
> --
> **************************************
>  tivanli
> **************************************
>
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Tianwang Li
Thanks,

*针对存储点,是你说的那样的。*

我还关注了另外一点,存储的更新频率。
我自己验证了一下,
在视图uv_per_10min,上的group by 聚合,因为求的UV,在max值不变的时,不会输出更新ES。
*这里如果是PV,更新ES的频率还是很高的。*

INSERT INTO cumulative_uv
SELECT time_str, MAX(uv)
FROM uv_per_10min
GROUP BY time_str;





Jark Wu <[hidden email]> 于2020年3月22日周日 上午10:52写道:

> Hi,
>
> time_str 在前面已经处理过了,处理成了 10:00, 10:10, 10:20... 这种10分钟间隔的点,所以按照 time_str
> 分组的话,一天下来也就 24*6 个点。
> 在 Flink SQL 中,并不一定要 GROUP BY TUMLBE 才能做类似窗口聚合的操作,直接 GROUP BY hour/min/ts
> 也能达到类似的效果。
> 只不过前者不会输出更新,且能自动清理 state,后者会输出更新且不会自动清理 state。
>
> Best,
> Jark
>
> On Sat, 21 Mar 2020 at 11:24, Tianwang Li <[hidden email]> wrote:
>
> > Hi, Jark , 看了你的文章,有一点不是很清楚。
> >
> > 基于 uv_per_10min 再根据分钟时间进行一次聚合,这样每10分钟只有一个点会存储在 Elasticsearch 中,对于
> > Elasticsearch 和 Kibana 可视化渲染的压力会小很多。
> >
> > INSERT INTO cumulative_uv
> > SELECT time_str, MAX(uv)
> > FROM uv_per_10min
> > GROUP BY time_str;
> >
> >
> > 怎么实现按分钟聚合?没有明显的窗口设置。有什么内在特性?
> >
> >
> > Jark Wu <[hidden email]> 于2020年3月20日周五 上午12:25写道:
> >
> > > Hi 你可以看下这篇文章是否满足的你需求:
> > >
> > >
> >
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql
> > > #
> > > <
> >
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql#
> > >
> > > 统计一天每10分钟累计独立用户数
> > >
> > > Best,
> > > Jark
> > >
> > >
> > > On Thu, 19 Mar 2020 at 23:30, hiliuxg <[hidden email]> wrote:
> > >
> > > > hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> > > > select&nbsp; &nbsp;
> > > > &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> > > > &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> > > > &nbsp;count(1) as pv ,&nbsp;
> > > > &nbsp;count(distinct userid) as uv&nbsp;
> > > > from t_user_log&nbsp;
> > > > where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and
> logintime <
> > > > '2020-03-19 12:05:00'&nbsp;
> > > >
> > > >
> > > > 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
> > >
> >
> >
> > --
> > **************************************
> >  tivanli
> > **************************************
> >
>


--
**************************************
 tivanli
**************************************
Reply | Threaded
Open this post in threaded view
|

Re: flink sql如何支持每隔5分钟触发当日零点到当前5分钟的聚合计算

Jark
Administrator
如果更新频率很高的话,可以开启 minibatch [1][2],减少输出量。

Best,
Jark

[1]:
https://ci.apache.org/projects/flink/flink-docs-master/dev/table/config.html
[2]:
https://ci.apache.org/projects/flink/flink-docs-master/dev/table/tuning/streaming_aggregation_optimization.html#minibatch-aggregation

On Sun, 22 Mar 2020 at 13:15, Tianwang Li <[hidden email]> wrote:

> Thanks,
>
> *针对存储点,是你说的那样的。*
>
> 我还关注了另外一点,存储的更新频率。
> 我自己验证了一下,
> 在视图uv_per_10min,上的group by 聚合,因为求的UV,在max值不变的时,不会输出更新ES。
> *这里如果是PV,更新ES的频率还是很高的。*
>
> INSERT INTO cumulative_uv
> SELECT time_str, MAX(uv)
> FROM uv_per_10min
> GROUP BY time_str;
>
>
>
>
>
> Jark Wu <[hidden email]> 于2020年3月22日周日 上午10:52写道:
>
> > Hi,
> >
> > time_str 在前面已经处理过了,处理成了 10:00, 10:10, 10:20... 这种10分钟间隔的点,所以按照 time_str
> > 分组的话,一天下来也就 24*6 个点。
> > 在 Flink SQL 中,并不一定要 GROUP BY TUMLBE 才能做类似窗口聚合的操作,直接 GROUP BY hour/min/ts
> > 也能达到类似的效果。
> > 只不过前者不会输出更新,且能自动清理 state,后者会输出更新且不会自动清理 state。
> >
> > Best,
> > Jark
> >
> > On Sat, 21 Mar 2020 at 11:24, Tianwang Li <[hidden email]> wrote:
> >
> > > Hi, Jark , 看了你的文章,有一点不是很清楚。
> > >
> > > 基于 uv_per_10min 再根据分钟时间进行一次聚合,这样每10分钟只有一个点会存储在 Elasticsearch 中,对于
> > > Elasticsearch 和 Kibana 可视化渲染的压力会小很多。
> > >
> > > INSERT INTO cumulative_uv
> > > SELECT time_str, MAX(uv)
> > > FROM uv_per_10min
> > > GROUP BY time_str;
> > >
> > >
> > > 怎么实现按分钟聚合?没有明显的窗口设置。有什么内在特性?
> > >
> > >
> > > Jark Wu <[hidden email]> 于2020年3月20日周五 上午12:25写道:
> > >
> > > > Hi 你可以看下这篇文章是否满足的你需求:
> > > >
> > > >
> > >
> >
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql
> > > > #
> > > > <
> > >
> >
> http://wuchong.me/blog/2020/02/25/demo-building-real-time-application-with-flink-sql#
> > > >
> > > > 统计一天每10分钟累计独立用户数
> > > >
> > > > Best,
> > > > Jark
> > > >
> > > >
> > > > On Thu, 19 Mar 2020 at 23:30, hiliuxg <[hidden email]> wrote:
> > > >
> > > > > hi all:有这样子一个场景,我想通过每隔5分钟统计当日零点到当前5分钟的pv和uv,用批处理大概大概表达如下:
> > > > > select&nbsp; &nbsp;
> > > > > &nbsp;'2020-03-19' as dt ,&nbsp;&nbsp;
> > > > > &nbsp;'2020-03-19 12:05:00'&nbsp; as etltime ,
> > > > > &nbsp;count(1) as pv ,&nbsp;
> > > > > &nbsp;count(distinct userid) as uv&nbsp;
> > > > > from t_user_log&nbsp;
> > > > > where&nbsp; logintime&nbsp; &gt;= '2020-03-19 00:00:00' and
> > logintime <
> > > > > '2020-03-19 12:05:00'&nbsp;
> > > > >
> > > > >
> > > > > 这里,没法用flink sql 处理,当时这种场景又特别多,各位大神有好的方案处理吗?
> > > >
> > >
> > >
> > > --
> > > **************************************
> > >  tivanli
> > > **************************************
> > >
> >
>
>
> --
> **************************************
>  tivanli
> **************************************
>