本文源码基于flink1.14

平台用户在使用我们的flinkSql时经常会开启minaBatch来优化状态读写

所以从源码的角度具体解读一下miniBatch的原理

先看一下flinksql是如何触发miniBatch的优化的

主要就是这个Calcite的rule了,来具体看一下

在对应的match方法中

会根据miniBatch的类型判断,是否需要添加一个Assigner的节点

这个assigner是干嘛的呢?这个Assinger是一个execNode和窗口的assigner是不一样的,这里主要是为了发送水印的

没错,miniBatch攒一批的实现原理就是通过水印,来作为一批的标识

来具体看看

分为处理时间和事件时间

先看看处理时间

逻辑比较简单,就是当前微批的开始时间大于当前水印,就发送一个当前的微批的开始时间的水印

然后,事件时间的没什么意思,就是水印直接往下游转发了

接着,攒微批已经将完了,来看下具体聚合算子怎么优化微批计算的吧

来看个StreamExecGroupAggregate这个聚合ExecNode的逻辑

既然是execNode来直接看它的translateToPlanInternal()方法

原来是直接在execNode里面做了特殊处理,不过也是,每个算子的优化都不一样也不太好抽象出来

这里还是 先看看不使用微批的时候是怎么处理的,然后来对比一下

没用微批这里是封装成了一个KeyedProcessOperator的算子,里面传的aggFunction直接就是一个KeyedProcessFunction

看下具体处理groupAggFunction

这里没有开minibatch的逻辑比较简单

每来一条数据,先读状态accState是一个valueState然后,调用聚合函数的accumlate来计算,然后用新得到的累加器更新状态

可以看到这样做的问题还是比较大的

第一,每一条数据都要读写状态开销很大

第二,每条数据都要调用计算,有很多虚函数的调用

因此,让我们看看MIniBatch是如何做的吧

回到上面,我们看到MiniBatch是创建的一个KeyedMapBundleOperator,里面的参数是MiniBatchGroupAggFunction

看下KeyedMapBundleOperator

先从一个bundle获取和数据同key的数据,来看下这个bundle是什么

ok,就是一个本地map,然后走addInput()

来看下MiniBatchGroupAggFunction的addInput方法

其实就是把,来的数据加到map对应key的Value是一个list里面去了

最后来看当微批攒够触发onTrigger会走到finishBundle()方法

先从buffer获取每一个key对应的value是一个list

然后读取状态state数据

直接for循环遍历微批的数据

然后调用聚合函数的accumulate不停计算

最后将计算好的累加器accumulator存到状态里面去

是不是很简单

这样微批处理就完成了,减少了状态的频繁访问,是一个很不错的优化

Flink sql 之 微批处理与MiniBatchIntervalInferRule (源码分析)的更多相关文章

  1. Flink sql 之 join 与 StreamPhysicalJoinRule (源码解析)

    源码分析基于flink1.14 Join是flink中最常用的操作之一,但是如果滥用的话会有很多的性能问题,了解一下Flink源码的实现原理是非常有必要的 本文的join主要是指flink sql的R ...

  2. Flink 非对齐Unaligned的checkpoint(源码分析)

    本文源码基于flink1.14 在帮助用户排查任务的时候,经常会发现部分task处理的慢,在Exactly once语义时需要等待快照的对齐而白白柱塞的情况 在flink1.11版本引入了非对齐的ch ...

  3. Flink中watermark为什么选择最小一条(源码分析)

    昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值)  这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...

  4. 从flink-example分析flink组件(1)WordCount batch实战及源码分析

    上一章<windows下flink示例程序的执行> 简单介绍了一下flink在windows下如何通过flink-webui运行已经打包完成的示例程序(jar),那么我们为什么要使用fli ...

  5. 【springcloud】1.微服务之springcloud-》eureka源码分析之请叫我灵魂画师。。。

  6. Flink sql 之 两阶段聚合与 TwoStageOptimizedAggregateRule(源码分析)

    本文源码基于flink1.14 上一篇文章分析了<flink的minibatch微批处理>的源码 乘热打铁分析一下两阶段聚合的源码,因为使用两阶段要先开启minibatch,至于为什么后面 ...

  7. 从flink-example分析flink组件(3)WordCount 流式实战及源码分析

    前面介绍了批量处理的WorkCount是如何执行的 <从flink-example分析flink组件(1)WordCount batch实战及源码分析> <从flink-exampl ...

  8. Flink中Idle停滞流机制(源码分析)

    前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...

  9. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

随机推荐

  1. 数仓day03-----日志预处理

    1. 为什么要构建一个地理位置维表(字典) 在埋点日志中,有用户的地理位置信息,但是原始数据形式是GPS坐标,而GPS坐标在后续(地理位置维度分析)的分析中不好使用.gps坐标的匹配,不应该做这种精确 ...

  2. 数组实现堆栈——Java实现

    1 package struct; 2 3 4 //接口 5 interface IArrayStack{ 6 //栈的容量 7 int length(); 8 //栈中元素个数(栈大小) 9 int ...

  3. Can namespaces be nested in C++?

    In C++, namespaces can be nested, and resolution of namespace variables is hierarchical. For example ...

  4. APICloud - 提交项目 点击右键 没有git这个选项

    你们是不是也遇到过这个问题,吧项目检出来后,花了很久的时间,好不容易吧项目改完,提交的时候点击鼠标右键,发现git选项没有在里面了,找不到,但是这个问题也不是很常遇到,机率很小,下面我来告诉你们吧 原 ...

  5. 【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串

    [题目] 有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母. 指令:A, B, L, R 把空格上.下.左.右的相邻字母移到空格中. [输入] 初始网格和指令序列(以数字0结束) ...

  6. ctypes与numpy.ctypeslib的使用

    numpy ctypeslib 与 ctypes接口使用说明 作者:elfin 目录 一.numpy.ctypeslib使用说明 1.1 准备好一个C++计算文件 1.2 ctypeslib主要的五个 ...

  7. Python循环控制

    一.比较符 和算术操作符一样,布尔操作符也有操作顺序.在所有算术和比较操作符求值后,Python 先求值 not 操作符,然后是 and 操作符,然后是 or 操作符. 二.if控制 if name ...

  8. UIWindow介绍

    1.作为容器,包含app所要显示的所有视图 3.与UIViewController协同工作,方便完成设备方向旋转的支持 1.addSubview 2.rootViewController 三.Wind ...

  9. IO多路复用技术总结

    来源:微信公众号「编程学习基地」 IO 多路复用概述 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用. 在IO多路复用技术 ...

  10. 花授粉优化算法-python/matlab

    import numpy as np from matplotlib import pyplot as plt import random # 初始化种群 def init(n_pop, lb, ub ...