starrocks对大量数据怎么实现hash join

以下是个人理解,可能不正确,希望评论指正:

pipeline构建

be的入口是:main->start_be,这里注册的doris::PBackendService中有一个exec_plan_fragment用来执行fe发来的查询计划。执行分两步:FragmentExecutor::prepare,FragmentExecutor::execute。

prepare阶段

在prepare阶段,FragmentExecutor::prepare->_prepare_pipeline_driver->PipelineBuilder::build中将HashJoinNode转为pipeline。hash join 节点的右侧是build 端,左侧是probe 端,在生成build 端时,会在build端加入一个SpillProcessOperator的pipeline算子。probe端与build端一起绑定了同一个HashJoiner节点。

execute阶段

在执行阶段FragmentExecutor::execute向GlobalDriverExecutor提交pipeline driver,当worker线程遍历到包含hash join node的driver节点时,调用PipelineDriver::process执行pipeline中每个pipeline算子,即从上游算子pull_chunk,再push_chunk到下游节点。

SpillableHashJoinBuildOperator从上游拉数据,会将chunk数据交到PartitionedSpillerWriter中,从而计算chunk中每行的hash 值,并生成它应属于哪个hash backet的索引(selections),当一个hash bucket满时,就将这个桶分裂一级,如果分裂至最高级时还满,就输出到文件中。

当一个SpillableHashJoinBuildOperator从上游获取完最后一条数据时,会调用 set_finishing将所在partition的stream 设置为eof状态

对于SpillableHashJoinProbeOperator,在检查has_output时,会起task去load所有build端的SpillerReader,当检查到build端一个partition 的eof状态时,ProbeOperator的has_output能就会检查

当driver扫描到SpillableHashJoinProbeOperator,它加载数据到一定程度,会调用pull_chunk,用build侧的hash表来join 本probe侧数据,将join上的返回,push_chunk到下一个pipeline节点。join不上的部分通过probe_remain补充null,并将结果返回。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值