本文源码基于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. [web安全] 利用pearcmd.php从LFI到getshell

    有一段时间没写blog了,主要是事多,加上学的有些迷茫,所以内耗比较大.害,沉下心好好学吧. 漏洞利用背景: 允许文件包含,但session等各种文件包含都已经被过滤了.ctf题中可以关注regist ...

  2. redis 之 集群

    #:下载源码包,并编译安装 [root@localhost src]# wget http://download.redis.io/releases/redis-4.0.14.tar.gz [root ...

  3. Mysql多字段模糊查询

    MySQL同一字段多值模糊查询 一. 同一字段多值模糊查询,使用多个or进行链接,效率不高,但没有更好的解决方案.(有看到CHARINDEX 关键字,可查询结果并不是模糊,举个栗子 例如SELECT ...

  4. 【Linux】【Services】【Web】Haproxy

    1. 概念 1.1. 官方网站 http://www.haproxy.org/ 2. 安装 yum安装 yum -y install haproxy keepalived 配置haproxy日志,修改 ...

  5. 【JS】枚举类型

    https://zhuanlan.zhihu.com/p/79137838 相当于用数字来代替一串字母 /** * 时间:2019年8月18日 * 前端教程: https://www.pipipi.n ...

  6. 因Console.Read()导致Centos 后台运行.net core程序报错

    .net 控制台程序通常用 Console.Read(),或者Console.ReadKey()让进程阻塞保持,不退出. 但在.net core 需要将程序放在后台执行时 用Console.Read( ...

  7. react18 来了,我 get 到...

    大家好! 本文主要是关于即将发布的 react 18 的新特性.那么 react18 带来了什么呢? 详情可以关注 github React 18 工作组仓库 1. automatic batchin ...

  8. Linux系统下安装tomcat

    一.前置条件 安装tomcat需要先安装jdk,所以没有安装jdk同学,详见参考文章 二.Linux上安装tomcat 1. 下载Apache tomcat tomcat官网下载地址 在左边,可以选择 ...

  9. Git远程操作(附重要原理图)

    原文出处: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容 ...

  10. NOAA数据下载方法

    NOAA OneStop https://data.noaa.gov/onestop/about NOAA 数据搜索平台,在一个地方同时搜索NOAA的 Geophysical, oceans, coa ...