Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析).docxVIP

Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档