1、为何distinct操作是会产生shuffle?
image.png
会产生shuffle的操作包括:reduceByKey、join、distinct、repartition等。通常来说,如果避免不了shuffle,在可能的情况下,建议使用reduceByKey或者aggregateByKey算子来替代掉groupByKey算子。因为reduceByKey和aggregateByKey算子都会使用用户自定义的函数对每个节点本地的相同key进行预聚合。而groupByKey算子是不会进行预聚合的,全量的数据会在集群的各个节点之间分发和传输,性能相对来说比较差。
2、Broadcast Join
image.png mapPartition解释如下: image.png
数据库的表一般分为两种:事实表和维度表。维度表一般指固定的、变动较少的表,例如联系人、物品种类等,一般数据量有限。而事实表一般记录流水,比如销售清单等,通常随着时间的增长不断膨胀。
join操作是对两个表中key值相同的记录进行连接,在spark SQL中,对两个表做join最直接的方式是先根据key分区,再在每个分区中把key值相同的记录拿出来做连接操作。但这样就不可避免地涉及到shuffle。
当维度表和事实表进行join操作时,为了避免shuffle,我们可以将大小有限的维度表的全部数据分发到每个节点上,供事实表使用。executor存储维度表的全部数据,一定程度上牺牲了空间,换取shuffle操作大量的耗时,这在spark SQL中称为Broadcast Join.
但是注意广播时需要将被广播的表先collect到driver端,当频繁有广播出现时,对driver的内存也是一个考验。
例子:
3、Coalease函数
image.png
网友评论