1.什么时候用window?什么时候用keyBy?
当需要获取有限数据的时候,就用window,比如获取最近10秒的数据,window就是在无界的数据流上,获取一部分数据进行计算。
基本上用flink必keyBy,只用keyBy不用window,就是计算历史至今的数据,就是计算当前key的所有数据。
2.flink的state为什么有的用initre方法获取state,有的用open方法?
因为有的算子不是keyedStream,没有生命周期方法,需要实现chekpiintFuntion,重写init方法,获取state,至于状态的备份,都不用我们管,flink会自动备份,备份到jobManager的内存上,还可以备份到HDFS上,包括open方法获取的state,flink都可以自动备份。
3.滚动窗口、滑动窗口、会话窗口源码
滚动窗口底层只有一个窗口,每次用for循环,把前面过期的数据移除,留下的数据再进行计算
滑动窗口的时间窗口,是有多个window的,因为有重叠的数据
计数窗口、计数滑动窗口,底层只有一个窗口
会话窗口只有一个window
4.会话窗口边界值
会话窗口中,最重要的参数就是会话的超时时间,也就是两个会话窗口之间的最小距离。如果相邻两个数据到来的时间间隔(Gap)小于等于指定的大小(size),那说明还在保持会话,它们就属于同一个窗口;如果gap大于size,那么新来的数据就应该属于新的会话窗口,而前一个窗口就应该关闭了。
5.窗口分组
flink开窗必group by,且先group by窗口
6.窗口聚合的区别
- 分组窗口聚合
- 有滚动窗口、滑动、会话
- 一般用会话窗口的时候使用分组窗口聚合
- 窗口表值函数(TVF)聚合
- 有滚动窗口、滑动、累积
- 支持grouping sets
- 一般用滚动窗口、滑动、累积窗口的时候,用TVF
- Over 聚合
- 就是平常用的开窗函数
7.聚合函数问题
如果有sum、min、max,只能用一种开窗函数,比如从上2行到当前行,否则会报错
8.Flink CDC是什么意思?
change data capture
修改数据捕获 ,类似于Maxwell
9. 什么时候创建window?
在当前window的第一个数据到来的时候,创建
10.怎么确定window的起始时间?结束时间?
向下取整
参考源码
11.window为什么是左闭右开的?
因为底层有一个获取最大时间的方法,内部减了1ms,所以如果window是0-10秒的,那么最大时间是10-1ms=9999ms,所以此window最大只能容纳9999ms的数据,所以10秒的数据是进不去的
12.window什么时候触发计算?
10秒的数据来的时候触发计算
因为底层会调用方法获取最大时间(减1ms那个方法)
13.如果设置了3秒乱序,那么13秒的数据会落到哪个窗口?
13秒的数据来的时候,会触发0-10的窗口计算,数据会落到10-20窗口
14.window什么时候关闭
- 触发计算就会关闭
- 如果设置了窗口延迟关闭,会等延迟时间到的时候关闭,这时再来数据是可以计算的
15.设置了窗口延迟关闭,再来数据是和之前的数据一起计算吗?
不是,会单独计算,发送到下游
16.3秒乱序,5秒窗口延迟关闭,和8秒乱序,没有窗口延迟关闭的区别是什么?
一个是13秒触发计算,一个是18秒触发计算
17.flink窗口的一般开发过程
- 设置水位线
- 分组
- 开窗
- 聚合
- 每个组的数据,每10秒输出一次结果,发送到下游
18.什么情况下会出现:先关联不上右表,然后一会又关联上的情况?
order_info
left join order_detail_activity
比如订单的数据先到,活动的数据后到,就会出现null的情况
这是两条不同的流
19.为什么不同aggregate的自定义聚合器(Hashset)统计UV呢?而用状态?
因为怕数据不在一个并行度
20.UV是什么?DAU是什么?
- uniqe visit:独立访客数
- Daily Active User:日活,日活跃用户数量,等于UV