以下是个人理解,可能不正确,希望评论指正:
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能就会检查文章来源:https://www.toymoban.com/news/detail-832521.html
当driver扫描到SpillableHashJoinProbeOperator,它加载数据到一定程度,会调用pull_chunk,用build侧的hash表来join 本probe侧数据,将join上的返回,push_chunk到下一个pipeline节点。join不上的部分通过probe_remain补充null,并将结果返回。文章来源地址https://www.toymoban.com/news/detail-832521.html
到了这里,关于starrocks对大量数据怎么实现hash join的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!