0
点赞
收藏
分享

微信扫一扫

微服务篇之负载均衡

眼君 2024-02-21 阅读 17

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

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,并将结果返回。

举报

相关推荐

0 条评论