一. broadcast join和partitioned join的区别
broadcast与partitioned join的主要区别见:
优点 | 缺点 | 适用场景 | |
broadcast join | 内存表无Hash重分布的开销 | 内存表在每个worker都是一份完整的拷贝; 探测表在并行探测前需要重分布 | join操作的2个表之中有一个表较小; Inner Join和Left Join场景; join无where条件 |
partition join | 内存表被Hash到各个worker,每个worker只有一部分内存表数据,因此可以支持超大内存表的Join操作 | 内存表和探测表需要重分布 | join操作的2表均为大表,无法全部加载到单一worker的内存中时; Right Join、Full Join场景; 2个表均大于join_max_broadcast_table_size场景 |
二. broadcast join和partitioned join选择
在Presto中,是选择broadcast还是partitioned的Join类型实现非常简单,就是将A join B的所有组合情况罗列一遍,然后求取每种情况的代价,选择代价最小的执行计划书执行,其实现代码在DetermineJoinDistributionType中实现。实现流程与Presto RBO之调整表的join顺序_王飞活的博客-CSDN博客 基本一样。
三. broadcast join和partitioned join的代价计算
exchange cost | 数据cost | |
broadcast join | 网络:内存表(build表)大小 * 节点个数 cpu: 内存表大小 | 内存:内存表大小*节点个数 cpu:内存表大小*节点个数 + 探测表大小 |
partitioned join | 网络:内存表大小+探测表大小 cpu:内存表大小+ 探测表大小 | 内存:内存表大小 cpu:内存表的大小 + 探测表的大小 |