【FlinkSql】一、基本了解
一、FlinkSQL
动态表,流表二象性。所谓动态表,就是数据会随着时间变化的表,可以想象成就是数据库中一张被不断更新的表。
二、流式 SQL 可以想象成连续查询
连续查询会一直运行在那里,当每个数据到来,都会持续增量地更新计算结果,从而产生另一个动态表。而这个结果动态表(也就是流)会作为另一个 SQL(连续查询)的输入接着计算,从而串起整个数据流图。
三、功能
双流 JOIN,维表 JOIN,TopN,Window,多路输出。TopN 是统计报表和大屏非常常见的功能,主要用来实时计算排行榜。除了全局 TopN 功能外,我们还提供了分组 TopN 的功能。
四、优化
MiniBatch 就是核心优化之一。对于有状态的算子来说,每个进入算子的元素都需要对状态做序列化/反序列化的操作,频繁的状态序列化/反序列化操作占了性能开销的大半。MiniBatch 的核心思想是,对进入算子的元素进行攒批,一批数据只需要对状态序列化/反序列化一次即可。
Retraction 撤回机制: early-fire 导致的结果正确性问题(所有的 GroupBy 都是 early-fire 的)。
五、细化优化
维表 JOIN:常见的需求就是为数据流补齐字段,商品维,地点维,用户维。
异步模式可以并发地处理多个请求和回复。也就是说,你可以连续地向数据库发送用户a、b、c等的请求,与此同时,哪个请求的回复先返回了就处理哪个回复,从而连续的请求之间不需要阻塞等待。
AsyncDataStream.(un)orderedWait 的主要工作就是创建了一个 AsyncWaitOperator,会运行 AsyncFunction 并处理异步返回的结果。AsyncWaitOperator 主要由两部分组成:StreamElementQueue 和 Emitter。Emitter 就会从队列中拉取完成的 Promise ,并从 Promise 中取出消息发送给下游。所有新进入该算子的元素(包括 watermark),都会包装成 Promise 并按到达顺序放入该队列
topN:最优的流式 TopN 的计算只需要维护一个 N 元素大小的小根堆,每当有数据到达时,只需要与堆顶元素比较,如果比堆顶元素还小,则直接丢弃;如果比堆顶元素大,则更新小根堆,并输出更新后的排行榜。 MapState 结构,MapState 是 Flink 提供的状态接口,用来存储 TopN 的数据(保证数据不丢)。
嵌套topN:计算全网排名前十的商铺,会导致单点的数据热点,那么可以先加一层分组 TopN,组的划分规则是根据店铺 ID 哈希取模后分成128组(并发的倍数)。第二层 TopN 与原先的写法一样,没有 PARTITION BY。第一层会计算出每一组的 TopN,而后在第二层中进行合并汇总,得到最终的全网前十。第二层虽然仍是单点,但是大量的计算量由第一层分担了,而第一层是可以水平扩展的
retract就是传统数据里面的更新操作。
这时,第一层group by的会先向下游发送一条 (0001,中通)的撤回消息,第二层group by节点收到撤回消息后,会将这个节点 中通对应的 value减少1,并更新到结果表中;
第一层的分桶统计逻辑向下游正常发送(0001,圆通)的正向消息,更新了圆通物流对应的订单数目,达到了最初的汇总目的。
开启minibatch:
# 表示整个job允许的延迟(必须参数)
blink.miniBatch.allowLatencyMs=5000
# 单个batch的size(可选参数)
blink.miniBatch.size=1000

浙公网安备 33010602011771号