Flink SQL 编程+实战

Flink将数据处理接口抽象成四层链接,下面主要整理最高层的 FlinkSQL。

Flink SQL 是什么(纯文本API)

声明式API:属于 Flink 最高层的API,易于使用,只需要知道我需要什么东西,底层会帮用户完成;
自动优化:屏蔽了 State的复杂性,自动做到最优处理。底层具有优化引擎;
流批统一:相同的统计逻辑,即可以流模型运行,也可以批模式运行;
应用广泛:ETL,统计分析,实时报表,实时风控。

Window 聚合(Aggregation)

我们需要在一个无线的数据流上,进行缓冲的工作。Flink 提供了如下三种缓冲方法:参数t在Flink中表示时间属性,只有基于时间属性才可以去做一些Window操作,分为两种Processing Time系统时间Row Time 事件的时间

【1】TUMBLE(t, INTERVAL '2' HOUR):固定的窗口,比如这里以2小时进行划分,那么在窗口上就会形成0-2,2-4...等划分。然后窗口里面的数据再去做聚合。
【2】HOP(t, INTERVAL '2' HOUR,INTERVAL '1' HOUR):滑动窗口,第一个参数是Window的大小,第二个参数是它滑动的步长。如下表示,2小时的窗口大小,1小时的滑动窗口。0-2、1-2、2-4、3-5...等这种有重叠式的Window。然后在化好的window上进行聚合操作。
【3】SESSION(t,INTERVAL '30',MINUTE):会话窗口,30表示会话窗口的间隔时间,如果超过这个时间就表示一个会话的结束。如上,表示的时3个独立的窗口。

Window 聚合案例:

每小时每个用户点击的次数:首先按照 user进行聚合,其次加上一个窗口的划分TUMBLE 按照用户点击的时间进行1小时的划分。select 中选出用户,以及每个窗口的结束时间和点击的次数。数据都是在末尾整点输出。如下:

Group 聚合案例:

从历史到现在每个用户点击的次数:就没有根据时间进行画窗口的操作。是一个无限流的操作,直接是按照用户进行分组。然后进行count统计。每来一条计算一条,结果是不断的更新。需要接一个可以更新的结构表(MySQL/Hbase等)如果要接一个日志系统/kafka等就会看到重复的内容,不满足用户的需要。

 Window AggregationGroup Aggregation
输出模式按时输出提前输出(来一条处理输出一条)
输出量只输出一次结果Per Key 输出N个结果(Sink压力大)
输出流Append StreamUpdate Stream
状态清理及时清理过期数据(知道什么时候窗口结束,所以可以清理)状态无限增加(不知道数据什么时候结束,所以不会清理状态)
在生产上不建议这么做,因为到最后作业的稳定性和性能都不能达到稳定的状态,
Sink输出到什么系统均可(Append Stream)只能输出到可更新的结果表HBase,MySQL等(Update Stream)

建议在上线 Group聚合的配置 State TTL Config:精确性与状态大小的一个权衡。建议是一天半左右,当然还要跟你的job去进行权衡,看job到底能容纳多少数据而定。

//最小到最大的等待时间,超过这个时间系统最会自动清除这个状态。如果说你清楚掉的这个数据再也用不到了,那就不影响。如果后面用到,那么这个结果就是不正确的了。所以这个配置是 精确性与状态大小的一个权衡。
streamQueryConfig.withIdleStateRetentionTime(Time.day(1), Time.day(2))

Flink SQL 构建流式应用实战

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页