- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)
实时数仓架构
2021-10-24
谢绝广告,从我做起
为了营造良好的学习环境,本谢绝一切训练媒体的广告投放!!!
基于flink1.14的源码做解析
公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今日同事突然问到我,Flink sql 是怎样实现topN的 ?
蒙圈了,这块源码没看过啊 ,业务要问起来怎样办,赶快打开源码补一下
拿到这个问题先冷静分析一下范围
首先确定属于Flink sql模块,源码里面确定是在flink-table-planner包里面,接着topN那不就是ROW_NUMBER嘛,是个函数呀
既然如此那就从flink源码的系统函数作为线索开头找起来,来到?org.apache.calcite.sql.fun.SqlStdOperatorTable类
果真找到了,那calcite的某个rule确定有个地方推断了它,连续查调用链
不出所料,FlinkLogicalRankRuleBase这个calcite的rule里面果真依据这个function的类型来确定rank的类型了
看下这个rule的婚配条件
?这里也好理解,overAgg的时候会推断这个rank以及对应的类型
这是只是做了一下简约的提取了rank的字段啊,提取谓语啊,提取表达式啊这一些拿信息的操作
然后直接生成新的relNode叫FlinkLogicalRank通过transformTo直接前往了这个等价节点
既然是relNode那确定又会有calcite的rule去处理它,来找一找
批处理的就不管了,从名字就可以看出来我们要找的类了
看个不带window的吧
?前往StreamPhysicalRank
这个类是一个FlinkPhysicalRel是可以转换成execNode的
这里在多说一句,
这里将partitionKey传入了,就是sql里面的partition by后面的,后面会用这个来创建transformation的keySelecter用来分流数据
前往的这个StreamExecRank就是可以转换成具体的Flink的算子了,具体规律就在里面了
接下来看下row_number的具体规律,找到方法translateToPlanInternal
依据策略次要分为三品种型
AppendFastStrategy? (输入仅包含插入时)
RetractStrategy? ?(输入包含update和delete)
UpdateFastStrategy? ? ?(输入不应包含删除且输入有给定的primaryKeys且按字段排序时)
来看个retractStrategy的吧
先通过sort的字段猎取一个用于排序RowData的比较器?ComparableRecordComparator
依据比较器创建?RetractableTopNFunction
这个类还有两个次要的形态数据结构
dataState这个map用来存放当key相同的全部数据会放在同一个list里面
treeMap这个可排序的map就是通过上面我们sql里面定义的sort by 来排序数据的,Long是指这个相同的key有多少个record
!!!!!!!!!!!? 那就是用java的treeMap排序呗
连续往下看
?主规律就是这个了
每进入一条数据,会依据这条数据的类型划分
当数据是Insert , UPDATE_AFTER类型是会走?emitRecordsWithRowNumber()方法
当数据是UPDATE_BEFORE,DELETE类型会走?retractRecordWithRowNumber ()方法
来看下具体规律先看INSERT的
?遍历treeMap
解读一下,当数据是insert数据的时候
INSERT数据会先放到treeMap里面去,delete则不会
按挨次遍历treeMap
当遍历过程中发觉遍历的key与当前数据的key相同时,和当前数据key相同的全部数据数据(dataState中的LIST),全部撤回并且更新他们的rowNumber+1
连续遍历treeMap
之后的数据全部撤回UpdateBefore,并且向下游发送UpdateAfter使rowNumber+1,遍历直到已经到第TopN个数据循环结束
?
当数据是DELETE类型的时候,会和Insert反过来,当前key之后的数据全部撤回,然后rowNumber-1
?
整个处理流程差不多就结束了,可以看到rowNumber当N较大且排序变化频繁的时候,功能消耗还是格外大的,极端情况下游的数据会翻很多倍
这个还需要留意在其他两个策略中还有一个参数,table.exec.to
您可能关注的文档
- ClickHouse源码阅读计划(一) Everything About MergeTree.docx
- JVM相关 SafePoint 与 Stop The World 全解(基于OpenJDK 版本).docx
- PCB布局规则_PCB设计设置技巧_PCB设计布局技巧及PCB设计布线注意事项 电子技术 .docx
- SpringBoot 源码解析——SpringApplicationRunListener 源码分析.docx
- toString()、String.valueOf、(String)强转,如何抉择,你真的了解吗.docx
- [创意绘本技法从入门到精通].飞乐鸟.扫描版创意画 幼儿美术课件.pdf
- [1分钟画出快乐简笔画].飞乐鸟.高清扫描版创意画 幼儿美术课件.pdf
- ②京剧国粹幼儿美术课件.pptx
- 2026高考英语01 必背词汇清单(知识清单,全国通用)英语学业水平考试合格考总复习1.docx
- 英唐智控:2025年三季度报告.pdf
原创力文档


文档评论(0)