💨流式计算与批式计算区别
✔数据存储
流式计算:Kafka、Pulsar批式计算:HDFS、Hive
✔数据时效性
流式计算:分钟级别批式计算:天级别
✔准确性
流式计算:精准和时效性之间取舍批式计算:精准
✔典型计算引擎
流式计算:Flink批式计算:Hive、Spark、 Flink
✔计算模型
流式计算:At Least Once / Exactly Once批式计算:Exactly-Once
✔资源模型
流式计算:长期持有批式计算:定时调度
✔主要场景
流式计算:实时数仓、实时营销、实时风控批式计算:离线天级别数据报表
🍳小结
批式计算一般是T+1的数仓架构 数据实时性越高,数据的价值越高 实时计算分为处理时间和事件时间 事件时间需要Watermark配合来处理乱序
自我思考
- 批式计算是一种批量、高时延、主动发起的计算。
- 流计算是一种持续、低时延、事件触发的计算作业。
💨流式计算中的核心功能
✨Watermark
🎈什么是Watermark
表示系统认为的 当前真实的事件时间
WaterMark翻译为水位线,什么时候用到水位线呢? 比如说水控在顺水的时候达到紧梯就会触发,若不放水就可以发现危险的现状。
在spark程序划分成窗口的时候,主要是衡量什么时候触发,这也是需要用到的水位线,其实它是来判断水位窗口触发的机制,在这个窗口水位线会不停的增加。
其实水位线有两种方式获取,一种是根据数据时间来提取,另一种是定期生成水位线。
当我们输入的数据有大也有小的,它就会用这个分区最大的Eventime作为它的水位线。
那么这个水位线是怎么计算出来的? 实水位线还有一个作用,让窗口延迟发,举一个例子,我们在生产环境中,拉数据是从中间件拉取出来的,如kafka。
在kakfa下有多个分区,由生产者写入进入,在生产者有2个或多个写,当一对一写完,它还会切换写,在kafka里如果只有一个分区它是有序的,但是多个分区就无法保证它是有序的。
🎈如何产生Watermark
可以通过Watermark Generator来生成
通常,在接收到source的数据后,应该立刻生成watermark;但是,也可以在source后应用简单的map或者filter操作,再生成watermark。
🎈如何传递Watermark
取上游所有subtask的最小值
🎈部分数据断流: ldle Source
🎈迟到数据处理: Window 算子是丢弃; Join 算子认为跟之前的数据无法join到
自我思考
Watermark也可以让窗口延迟发,在生产环境中,拉数据是从中间件拉取出来的,如kafka。
在kakfa下有多个分区,由生产者写入进入,在生产者有2个或多个写,当一对一写完,它还会切换写,在kafka里如果只有一个分区它是有序的,但是多个分区就无法保证它是有序的。
💨Window
🎈什么是Window
在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的5分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。
🎈Window分类
✨典型的Window:
Tumble Window (滚动窗口) Sliding Window (滑动窗口)Session Window (会话窗口)
✨其它Window:
全局WindowCount Window累计窗口...
🍳滚动窗口
窗口划分:1.每个key单独划分 2.每条数据只会属于一 个窗口窗口触发:Window结束时间到达的时候一次性触发
🍳滑动窗口
窗口划分:1.每个key单独划分 2.每条数据可能会属于多个窗口窗口触发:Window结束时间到达的时候一次性触发
🍳会话窗口
窗口划分:1.每个key单独划分 2.每条数据会单独划分为一 个窗口,如果window之间有 交集, 则会对窗口进行merge窗口触发:Window结束时间到达的时候一次性触发
💨处理迟到数据
🎈怎么定义迟到
一条数据到来后, 会用WindowAssigner给它划分一个window, -般时间窗C是一个时间区间,比 如[10:00, 11:00),如果划分出来的window end比当前的watermark值还小,说明这个窗口已经触 发了计算了,这条数据会被认为是迟到数据。
🎈什么情况下产生迟到数据
只有事件时间下才会有迟到的数据。
🎈迟到数据默认处理
丢弃
💨Allow lateness
这种方式需要设置一个 允许迟到的时间。设置之后,窗口正常计算结 束后,不会马上清理状态,而是会多保留allowl ateness这么长时间, 在这段时间内如果还有数据到来,则继续之前的状态进行计算。
适用于: DataStream、 SQL
💨SideOutput (侧输出流)
这种方式需要对迟到数据打一个tag,然后在DataStream.上根据这 个tag获取到迟到数据流,然后业务层面自行选择进行处理。
适用于: DataStream
💨EMIT触发
✔什么叫EMIT
通常来讲,window都是在结束的时候才能输出结 果,比如1h的tumble window,只有在1个小时结 束的时候才能统一输出结果。 如果窗口比较大,比如1h或者1天,甚至于更大的话, 那计算结果输出的延迟就比较高,失去了实时计算 的意义。 EMIT输出指的是,在window没有结束的时候, 提前把window计算的部分结果输出出来。
✔怎么实现
在DataStream里面可以通过自定义Trigger来实现, Trigger的结果可以是:🚩CONTINUE🚩FIRE (触发计算, 但是不清理)🚩PURGE🚩FIRE AND PURGE
SQL也可以使用,通过配置:
table.exec.emit.early- fire.enabled=truetable.exec.emit.early-fire.delay={time}
💨Window-优化
1. Mini-batch优化解决频繁访问状态的问题
2. local-global 优化解决倾斜问题
3. Distinct 状态复用降低状态量
4. Pane 优化降低滑动窗[的状态存储量