这是我参与「第四届青训营」笔记创作活动的第5天。
知识点小记
流式计算和批式计算的区别
| 批式计算 | 流式计算 | |
|---|---|---|
| 数据存储 | HDFS、Hive | Kafka、Pulsar |
| 数据时效性 | 天 | 分钟 |
| 准确性 | 精准 | 精准和时效性之间取舍 |
| 常用计算引擎 | Hive、Spark、Flink | Flink |
| 计算模型 | Exactly-Once | At-Least-Once/Exactly-Once |
| 资源模型 | 定时调度 | 长期持有 |
| 主要业务场景 | 离线天级别业务 | 实时性要求高的业务 |
事件时间:数据产生的时间
处理时间:数据在流式计算机系统中真正处理时所在机器的当前时间
watermark事件时间计算
在数据中插入一些Watermark来标识表示系统认为的当前真实的事件时间,其相对比的是机器的时间,在数据乱序的时候,它可以用来在乱序容忍和实时性之间做一个平衡。
watermark传递机制:下游的 subtask 会将接收到的上游的所有 watermark 值的最小值作为该 subtask 的 watermark 的值。
断流
根据watermark传递机制,如果上游有一个算子的watermark不更新了,则下游的watermark都得不到更新而产生断流。
解决方案:
设置一个超时时间,当某个算子断流超过配置的超时时间时,会将当前算子置为idle,并下发一个idle状态给下游,下游算子在计算自身 watermark 的时候,可以忽略掉当前是idle的那些算子的watermark而去计算除状态为idle之外的算子的watermark。
迟到数据的处理
迟到的定义:对于迟到最基本的理解可以定义为数据晚于watermark即为迟到。但在window里,一条数据可能会晚于watermark,但是这条数据所属的window并没有触发,这种情况下我们可以定义这条数据是没有迟到的。
处理方法
- Allow lateness: 设置允许迟到的时间,窗口正常结束后不马上清理,而最多保留允许迟到的时间的时间,这段世间内如果有数据到来,则会继续之前的状态进行计算。
- SideOutput: 对指定的迟到数据在业务层面进行自主选择处理
数据计算方式
-
增量计算:数据来到后直接进行计算
-
全量计算:数据来到后不立即计算,而是保存下来,等到窗口要输出结果的时候,才把所有保存的数据进行统一的计算。