一. 前言
在Presto中,当两表Join为Hash Join并且join_distribution_type为PARTITIONED的时候,Presto会将Build表分区(Partition)后再进行Join操作。在Presto中的Join操作中,对表的分区有两级,第一级是将Hash和Probe表的Hash列不同的Hash值的行分到不同的worker之间并行Join计算,第二级是节点内部再进行二次分区,将Hash列的Hash值再Hash计算,然后分配到不同的HashBuilderOperator中并行Join计算。本文主要简述Presto中这两级Partition的实现。
二. 节点间Partition
为了使得可以多个节点之间并行Join,但是又不可能将Hash包和Probe表的数据都装到同一个节点上,就得要求Hash表和Probe表Join Key列的相同的Hash值的数据在调度的时候要被调度到相同的一个节点上才能进行碰撞操作。Presto此功能的实现是通过依赖PartitionedOutputOperator算子的实现的。
在PartitionedOutputOperator中,对于每一个TableScan中过来的Page,都会根据Hash列计算Hash值,然后与worker的数据取余求得改行数据应该被调度到哪个worker上进行Join计算。主要代码如下所示:
求取任意一行的数据应该所在的分区:bucketCount就是worker的数量:

对TableScan进行Partition:

本文详细阐述了Presto在执行HashJoin时的分区策略,包括节点间的Partition,通过PartitionedOutputOperator将相同JoinKey的数据调度到同一节点,以及节点内部的二次Partition,使用PartitioningExchanger将Build表数据进一步分散到多个HashBuilderOperator以加速计算。这种两级分区策略提高了Presto的并行处理能力和效率。
最低0.47元/天 解锁文章
922

被折叠的 条评论
为什么被折叠?



