其实在Presto中,hash_partition_count的意义是限制一个Stage最多可以在多少个worker节点上运行,hash_partition_count超过Worker的总数量时此参数不起作用。其实也就是说此参数可以控制一个Stage最多可以拆封成多少个Task并行运行,当此参数调小时,一个查询的并行度也因为Task个数变小而变小,从而性能下降。
hash_partition_count也不是对所有类型的Stage都可以生效,只有对可拆分成多个Task运行 的Stage才生效,比如Partition Join, Order by等算子,对于TableScan,TaskOutput等不可拆分运行的Stage,此参数不起作用。
hash_partition_count的实现原理也很简单,就是在生成Parition与执行Node节点的映射关系的时候,返回最大可调度的worker数量为min(hash_partition_count, worker数量)即可,核心代码如下所示: